Android自定义控件系列——PathMeasure类全解析

PathMeasure

构造方法

PathMeasure();
PathMeasure(Path path, boolean forceClosed);
//forceClosed	是否close这个path

常用API

//设置path,与构造方法配合使用
setPath(Path path, boolean forceClosed);
//测量Path的长度
getLength();
//判断轮廓路径是否是闭环的
isClosed();
//移动到下一个轮廓,如轮廓有多个path,则返回true.
nextContour();
getMatrix(float distance, Matrix matrix, int flags);
//根据距离返回坐标点和点的切线值并存入pos与tan
//0 <= distance <= getLength()
getPosTan(float distance, float[] pos, float[] tan);
//传入一个开始和结束距离(0..getLength()),然后会返回介于这之间的Path并传入到dst中
getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo);
//startWithMoveTo	决定开始距离是否从MoveTo坐标为参照物

案例

//创建轨道path
private Path trackPath = new Path();
//创建目标path
private Path dstPath = new Path();
private Paint paint;
private PathMeasure mPathMeasure;
//进度
private float fraction;

@Override
protected void onDraw(Canvas canvas) {
    //重置两个path
    trackPath.reset();
    dstPath.reset();
    //为轨道path添加路径
    trackPath.addCircle(centerX, centerY, 100, Path.Direction.CCW);
    //为mPathMeasure设置路径
    mPathMeasure.setPath(trackPath, false);
    //将mPathMeasure中的路径的一部分生成到目标path中
    mPathMeasure.getSegment(0, mPathMeasure.getLength() * fraction, dstPath, false);
    //绘制目标path
    canvas.drawPath(dstPath, paint);
}
public void goPathAnim(long duration) {
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
    valueAnimator.setDuration(duration);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            //生成进度
            fraction = (Float) animation.getAnimatedValue();
            //刷新操作
            postInvalidate();
        });
        valueAnimator.start();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值