android PathMeasure类 详细介绍

本文介绍了Android中的PathMeasure类,详细讲解了其构造函数、getLength()方法、getSegment()方法和getPosTan()方法的用法,并通过实例展示了如何利用这些方法实现图形的动态效果,如华为手机关机动画。此外,还分析了一个三角形箭头旋转的效果实现过程,帮助读者深入理解PathMeasure类的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天周四了,后台还是没时间弄接口,我也只好自high了,上篇博客讲了Path以及贝塞尔曲线的入门知识,今天讲下PathMeasure类,这个类太强大了,所以今天学习下,从类名上看就是对Path进行测量,是path的一个辅助类,现在看看PathMeasure类都有哪些方法给我们调用,以及每个方法都啥意思,你懂这些了,还怕玩不了它,哪直接玩死它,


就这几个方法,其中还有2个是构造函数,

无参的构造函数:

如果是无参的,你想想PathMeasure是操作Path的,你Path都没创建出来,操作个毛线,对吧,所以肯定提供了set...什么方法给Path赋值的,我们也看到后面确实提供了setPath()方法,

有2个参数的构造函数,

public PathMeasure(Path path, boolean forceClosed)

参数说明:

path:操作路径的对象

forceClosed:是否关闭,我们知道path类它就有个close()方法,意思是当绘制的路径大于3时,会前后连接成一个图形,比如三角形,四角行等等,这个形参会直接影响到getLength()方法的值,现在通过构造函数和getLength()一起演示下,结合测试和现象你才更明白,ok,写demo开始了

package com.pathmeasuredemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
 * Created by admin on 2016/12/14.
 */
public class PathMeaView1  extends View {
    private static final String TAG = "PathMeaView1";
    private Path path;
    private Paint paint;
    private int width;
    private int height;
    public PathMeaView1(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        path = new Path();
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getMeasuredWidth();
        height = getMeasuredHeight();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.translate(width/2,height/2);
        path.addRect(new RectF(-100,-100,100,100), Path.Direction.CW);
        PathMeasure pathMeasure = new PathMeasure(path,true);
        Log.e(TAG,"length="+pathMeasure.getLength());
        canvas.drawPath(path,paint);
    }
}
效果图:


打印的结果:

12-15 02:05:57.880 3651-3651/com.pathmeasuredemo E/PathMeaView1: length=800.0

然后你把PathMeasure类的构造函数第二个参数改为false,其实最后打印结果还是800,哪不是没区别么,那不是欺骗老百姓么,不怕被弄死,我只想说,大哥,你path绘制的是一个正方形路径,本来就已经闭合了,所以你false还是true肯定是一样了,在这开始是讲一个特例,我现在绘制一个U行,最后一个线不绘制出来,那么这个时候就可以测试出PathMeasure类构造函数中第二个参数的意义了

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.translate(width/2,height/2);
    path.lineTo(0,100);//没有调用moveTo()就是以(0,0)为起点了,
    path.lineTo(100,100);
    path.lineTo(100,0);
    PathMeasure pathMeasure1 = new PathMeasure(path,false);
    PathMeasure pathMeasure2 = new PathMeasure(path,true);
    Log.e(TAG,"pathMeasure1的长度"+pathMeasure1.getLength());
    Log.e(TAG,"pathMeasure2的长度"+pathMeasure2.getLength());
    canvas.drawPath(path,paint);
}
在这解释下canvas.translate()为啥要平移,因为这个view是除了标题栏和状态栏一下全部的,平移到view的重点,好计算坐标,也许你看到很多博客这么写,

如图:


现在看下我们上面代码执行的效果:


打印结果如下:

12-15 02:31:39.240 26470-26470/com.pathmeasuredemo E/PathMeaView1: pathMeasure1的长度300.0
12-15 02:31:39.240 26470-26470/com.pathmeasuredemo E/PathMeaView1: pathMeasure2的长度400.0

看看区别出来了吧

true:表示起点和终点闭合了,但不是说path图形闭合了

false:表示起点和终点没有闭合

public boolean getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo) 截取path一部分

参数说明:

startD:开始截取位置距离path起点的位置,这不是一个坐标值,是没有负数的

stopD:结束点距离path起点的位置,同理上,这个是小于等于path的总长度(pathmeasure.getLength())

dst:截取的图形成一个path对象,

startWidthMoveTo:表示起点位置是否使用moveTo()

现在通过demo演示:


@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.translate(width/2,height/2);
    path.addRect(new RectF(-100,-100,100,100), Path.Direction.CW);
    canvas.drawPath(path,paint);
    PathMeasure pathMeasure= new PathMeasure(path,false);
    Path dst = new Path();
    pathMeasure.getSegment(100,400,dst,true);
    paint.setColor(Color.BLUE);
    canvas.drawPath(dst,paint);
}
效果图:


上面是效果和分析图

现在把getSegment()第四个参数startWithMoveTo参数改为false效果如下:


从2个图对比就可以看的出来true表示不和path的起点连接 false表示和path起点连接,这个说的起点是针对view而言,

利用上面的方法作用,我来实现华为手机关机或者重启一个点在圆的轨迹上做运动的,这里讲2种实现方法

第一种是通过动画完成

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值