今天周四了,后台还是没时间弄接口,我也只好自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种实现方法
第一种是通过动画完成