Android Path进阶之Path常用API

Path的使用

自定义PathView继承View,在构造函数中初始化画笔和path,代码简单,如下

public class PathView extends View {

    private Paint mPaint;
    private Path mPath;

    public PathView(Context context) {
        this(context, null);
    }

    public PathView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PathView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        mPaint.setColor(Color.BLUE);
        mPath = new Path();
    }
}

path和paint都初始化完成,接下来就是对ondraw方法中绘制了,调用path的一些列api对path进行操作,操作完成最后别忘了使用canvas.drawPath将path绘制到画布上,简单使用流程就讲完了

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        
        ......
        对path进行操作
        ......
        
        canvas.drawPath(mPath, mPaint);

    }

常用API

接下来我们讲解对Path的操作常用的api。

1.一阶贝塞尔曲线,一阶贝塞尔曲线其实就是1条直线,没有控制点,从起始点到结束点连接直线,首先moveTo(500,500)将path移动(500,500)坐标,然后lineTo(600, 600)是将从(500,500)绘制到(600,600),lineTo函数的两个参数是坐标值,还有个函数rLineTo(float dx, float dy),rLineTo的参数是相对值,是横坐标增加dx,纵坐标增加dy,close函数则表示是否闭合,调用close会将path的起点到终点连接起来

        //一阶贝塞尔曲线,表示的是一条直线
        mPath.moveTo(500, 500);//移动
        mPath.lineTo(600, 600);//连线
//        mPath.rLineTo(100, 100);//等同于上一行代码效果
        mPath.lineTo(500, 600);
        mPath.close();//设置曲线是否闭合

2.添加子图形addxxx

        //添加子图形addXXX

        //添加弧形 addArc(float left, float top, float right, float bottom, float startAngle,float sweepAngle)
        mPath.addArc(0, 0, 200, 200, 45, 270);

        //添加矩形 addRect(float left, float top, float right, float bottom, Direction dir)
        mPath.addRect(300, 5, 900, 200, Path.Direction.CW);//Path.Direction.CW表示顺时针方向绘制,CCW表示逆时针方向

        //添加一个圆 addCircle(float x, float y, float radius, Direction dir)
        mPath.addCircle(200,400, 100, Path.Direction.CW);

        //添加一个椭圆 addOval(float left, float top, float right, float bottom, Direction dir)
        mPath.addOval(400,300,900,500, Path.Direction.CCW);

 3.追加图形xxxTo

        mPath.moveTo(0, 0);
        mPath.lineTo(100, 100);
        //arcTo(float left, float top, float right, float bottom, float startAngle,float sweepAngle, boolean forceMoveTo)
        //forceMoveTo,true,绘制时移动起点,false,绘制时连接最后一个点与圆弧起点
        mPath.arcTo(400, 0, 600, 200, -180, 225, false);

4.添加一个路径

        mPath.moveTo(100, 70);
        mPath.lineTo(140, 180);
        mPath.lineTo(250, 330);
        mPath.lineTo(400, 630);
        mPath.lineTo(100, 830);

        Path newPath = new Path();
        newPath.moveTo(100, 1000);
        newPath.lineTo(600, 1300);
        newPath.lineTo(400, 1700);
        mPath.addPath(newPath);

5.添加圆角矩形

        RectF rectF5 = new RectF(200, 800, 700, 1200);
        mPath.addRoundRect(rectF5, 100, 100, Path.Direction.CCW);

6.二阶贝塞尔曲线

        mPath.moveTo(300, 500);
        mPath.quadTo(500, 100, 800, 500);//前两个是控制点,后两个是终点坐标
        //参数表示相对位置,等同于上面一行代码
//        mPath.rQuadTo(200, -400, 500, 0);

7.三阶贝塞尔曲线

        mPath.moveTo(300, 500);
        mPath.cubicTo(500, 100, 600, 1200, 800, 500);//前4个代表两个控制点,后2个参数代表终点坐标
        //参数表示相对位置,等同于上面一行代码
//        mPath.rCubicTo(200, -400, 300, 700, 500, 0);

Demo:https://github.com/987570437/PaintDemo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值