Canvas之drawPath

来源:互联网 发布:云南省扶贫大数据平台 编辑:程序博客网 时间:2024/06/05 00:38

文章所有知识都是从这里学习的
http://www.gcssloop.com/customview/Path_Basic

path

Canvas利用Path可以绘制更复杂的图形.

path常用方法表:

去除了部分API21(即安卓版本5.0)以上才添加的方法。

Path方法使用

lineTo();

 Path path = new Path();    //lineTo() 画一条直线,参数为终点的坐标,起点坐标为上一次的终点,如果第一次绘制,起点坐标为(0,0);    path.lineTo(200,200);    path.lineTo(200,0);    canvas.drawPath(path, mPaint);

moveTo()和setLastPoint();

在绘制之前,使用moveTo和setLastPoint的效果相同
moveTo()

     Path path = new Path();    //lineTo() 画一条直线,参数为终点的坐标,起点坐标为上一次的终点,如果第一次绘制,起点坐标为(0,0);    path.lineTo(200,200);    path.moveTo(200,100);    path.lineTo(200,0);    canvas.drawPath(path, mPaint);
setLastPoint();

     Path path = new Path();    //lineTo() 画一条直线,参数为终点的坐标,起点坐标为上一次的终点,如果第一次绘制,起点坐标为(0,0);    path.lineTo(200,200);    path.setLastPoint(200,100);    path.lineTo(200,0);

close();

close的作用是封闭路径,与连接当前最后一个点和第一个点并不等价。如果连接了最后一个点和第一个点仍然无法形成封闭图形,则close什么也不做

addxxx()/addTo

  • 添加基本图形

path.addRect(-200,-200,200,200, Path.Direction.CW);path.addCircle(0,0,200, Path.Direction.CCW);
  • 添加path

    Path src = new Path();    path.addRect(-200,-200,200,200, Path.Direction.CW);    src.addCircle(0,0,200, Path.Direction.CCW);    path.addPath(src,0,200); //把圆形平移坐标后添加进path    canvas.drawPath(path, mPaint);
  • addArc()和ArcTo();

    arcTo();

    path.lineTo(100,100);    canvas.scale(1,-1);    RectF oval = new RectF(0,0,300,300);    path.arcTo(oval,0,270,false);    canvas.drawPath(path, mPaint);

addArc();

     path.lineTo(100,100);    canvas.scale(1,-1); //翻转坐标系    RectF oval = new RectF(0,0,300,300);    path.addArc(oval,0,270);    // path.arcTo(oval,0,270,true);             // <-- 和上面一句作用等价    canvas.drawPath(path, mPaint);

贝塞尔曲线.

  • 二阶贝塞尔曲线

    两个数据点,一个控制点 蓝色为辅助线. 红色为贝塞尔曲线.

    //二阶贝塞尔曲线    int width = canvas.getWidth()/2;    int height = canvas.getHeight()/2;    mPaint.setStyle(Paint.Style.STROKE);    //绘制起始点    canvas.drawPoint(width-200,height,mPaint);    //绘制结束点    canvas.drawPoint(width+200,height,mPaint);    //绘制辅助线    mPaint.setStrokeWidth(5);    mPaint.setColor(Color.BLUE);    canvas.drawLine(width-200,height,100,200,mPaint);    canvas.drawLine(width+200,height,100,200,mPaint);    //绘制贝塞尔曲线    mPaint.setStrokeWidth(10);    mPaint.setColor(Color.RED);    Path path = new Path();    path.moveTo(width-200,height);    //前两个参数为控制点坐标,后两个为结束点坐标    path.quadTo(100,200,width+200,height);    canvas.drawPath(path,mPaint);**
  • 三阶贝塞尔曲线

    两个数据点,二个控制点 蓝色为辅助线. 红色为贝塞尔曲线.

       //二阶贝塞尔曲线    int width = canvas.getWidth()/2;    int height = canvas.getHeight()/2;    mPaint.setStyle(Paint.Style.STROKE);    //绘制起始点    canvas.drawPoint(width-200,height,mPaint);    //绘制结束点    canvas.drawPoint(width+200,height,mPaint);    //绘制辅助线    mPaint.setStrokeWidth(5);    mPaint.setColor(Color.BLUE);    canvas.drawLine(width-200,height,100,200,mPaint);    canvas.drawLine(100,200,300,200,mPaint);    canvas.drawLine(300,200,width+200,height,mPaint);    //绘制贝塞尔曲线    mPaint.setStrokeWidth(10);    mPaint.setColor(Color.RED);    Path path = new Path();    path.moveTo(width-200,height);    //前四个参数为两个控制点坐标,后两个为结束点坐标    path.cubicTo(100,200,300,200,width+200,height);    canvas.drawPath(path,mPaint);

布尔操作(api19及以上)

    int width = canvas.getWidth();    int height = canvas.getHeight();    mPaint.setStrokeCap(Paint.Cap.ROUND);    canvas.translate(0, height / 12);    canvas.drawLine(100, 0, width - 100, 0, mPaint);    canvas.translate(width / 2, height / 2);    Path path1 = new Path();    Path path2 = new Path();    Path path3 = new Path();    Path path4 = new Path();    path1.addCircle(0, 0, 200, Path.Direction.CW);    path2.addRect(0, -200, 200, 200, Path.Direction.CW);    path3.addCircle(0, -100, 100, Path.Direction.CW);    path4.addCircle(0, 100, 100, Path.Direction.CCW);    path1.op(path2, Path.Op.DIFFERENCE);    path1.op(path3, Path.Op.UNION);    path1.op(path4, Path.Op.DIFFERENCE);    canvas.drawPath(path1, mPaint);
0 0
原创粉丝点击