1、View 

 

postInvalidate() ; //force view to draw again.

2、Canvas 画布

  Canvas 原点为 左上角;

  Canvas可以绘制的对象有:弧线(arcs)、填充颜色(argb和color)、 Bitmap、圆(circle和oval)、点(point)、线(line)、矩形(Rect)、图片(Picture)、圆角矩形 (RoundRect)、文本(text)、顶点(Vertices)、路径(path);

  Android还提供了一些对Canvas位置转换的方法:rorate、scale、translate、skew(扭曲)等,而且它允许你通过获得它的转换矩阵对象(getMatrix)方法;

  1、canvas.translate(x,y):以偏移原点(x,y)的位置作为坐标原点;例如,原来坐标原点在(100,100),translate(1,1),新坐标原点为(101,101);

  2、canvas.save() & restore() 

    save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作;

    restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响;

 

  canva还可以制作很多自定义控件,比如google日历的monthview就是用canvas绘制出来的,github上有很多使用canva的项目,所有的图表库都是用canvas绘制的;

public class CustomView1 extends View {

    Paint paint;
    private ArrayList<PointF> points=new ArrayList<>();

    public CustomView1(Context context){
        super(context);

        paint=new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.YELLOW);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeWidth(3);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.BLACK);
        for(PointF point : points){
            canvas.drawPoint(point.x,point.y,paint);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        points.add(new PointF(event.getX(), event.getY()));
        postInvalidate();
        return true;
    }
}

3、Paint 画笔,该类有我们所需要的方法来在canvas上画图

4、Path ,该类封装几何路径,可以由直线线段、二次曲线、三次曲线组成