然后我们来看一下PahtMeasure的源码:
一个是无参数构造,通过setPath设置边的长度
另外一个是直接将serPath传到参数进入
当setPath等于true的时候:
运行结果:日志打印结果为800,表示矩形的长度是800,
当为false的时候,运行结果是:
只获取了三个边的长度:
不管使用哪种构造方法 ,如果对Path进行了调整,
第二个方法:截取:
startD:开始截取的位置: stopD:结束截取的位置
Demo:
mPaint设置的是黑色画笔,mLinePaint设置的是蓝色画笔,测量好了path的长度,然后通过getSegment从200开始,到1000结束,
运行结果:
现在给dst路径先添加一条直线;
然后我们再来看一结果,不受任何影响
如果为StartMoveTo设置成false,
去掉直线设置成false,从路径的最后一个点开始连线,而不是从截取的位置开始连线
3,跳转到下一条跳转路径
//跳转到下一条曲线 pathMeasure.nextContour();
运行结果:长度为800,是矩形的长度,而并没有将圆的长度给计算出来
添加 pathMeasure.nextContour();、表示跳转到下一条曲线:
我们看打印的两个结果:
第二个打印的是圆的长度
4:是否获取成功:getPosTan
返回值:booean
distance:表示距离path起点的长度 0-path
pos 表示当前点在画布上的位置 将数据保存到这里
tan:当前点在曲线上的方向,(当前点pos与x轴切点的点的坐标 ),通过他可以获取到切线与x轴的夹角 将数据保存到这里
Demo:
看一下打印的结果:
pos【0】【1】:200 表示的是:距离path起点长度为0的这个位置他在画布上的x坐标和y坐标:(200,0)
tan 表示的是当前点在曲线上的切线的点 通过这个点可以获取角度等信息:通过使用
double degree= Math.atan2(tan[0],tan[1]) * 180 / Math.PI 计算的是当前切线与x轴夹角的度数
一个小demo:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by ThinkPad on 2019/11/21.
* 先在中心画个圆
* 然后将图片放置到圆上 ===切线的点 不断改变角度
* 然后让这个图片沿着这个圆开始运动 tanslate方法
*
*/
public class PathMeasureDemo extends View{
private Path mPath;
private Paint mPaint;
private Paint mLinePaint;
private Bitmap mBitmap;
private Matrix matrix;
public PathMeasureDemo(Context context) {
super(context);
init();
}
public PathMeasureDemo(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public PathMeasureDemo(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
mPath =new Path();
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(4);
mLinePaint=new Paint();
mLinePaint.setColor(Color.BLACK);
mLinePaint.setStyle(Paint.Style.STROKE);
mLinePaint.setStrokeWidth(4);
BitmapFactory.Options options =new BitmapFactory.Options();
options.inSampleSize = 4;
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.arrow,options);
matrix =new Matrix();
}
private float[] pos =new float[2];
private float[] tan =new float[2];
private float mFloat =0;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(0,getHeight()/2,getWidth(),getHeight()/2,mPaint);//先画一条横线
canvas.drawLine(getWidth()/2,0,getWidth()/2,getHeight(),mPaint);//再画一条竖线
//再画一个圆
//将圆心设置到中心
canvas.translate(getWidth()/2,getHeight()/2);
//再画一个圆
mPath.addCircle(0,0,200,Path.Direction.CW);
canvas.drawPath(mPath,mPaint);//不通过canvans直接画圆
mFloat += 0.01;
if (mFloat >= 1){
mFloat = 0;
}
//然后让图片显示到圆上
//1 最开始显示到某个点上 这个点通过PathMeasure的方法来确定 比如在0.1这个点开始
PathMeasure pathMeasure =new PathMeasure(mPath,false);
//从哪个点开始=pos[] 表示的是表示当前点在画布上的位置 tan[]表示的是(当前点pos与x轴切点的点的坐标)
pathMeasure.getPosTan(pathMeasure.getLength()*mFloat,pos,tan);
double degree = Math.atan2(tan[1],tan[0]) * 180.0 /Math.PI;
matrix.reset();
//将图片根据每次不同的角度 而进行旋转
matrix.postRotate((float)degree,mBitmap.getWidth() /2,mBitmap.getHeight()/2);
//
//将图片的绘制点中心与当前点重合,通过上面我们已经获取到了当前点 所以我们将图片移动到这个位置就好了啊
matrix.postTranslate(pos[0]-mBitmap.getWidth()/2,pos[1]-mBitmap.getHeight()/2);
canvas.drawBitmap(mBitmap,matrix,mPaint);
invalidate();
}
}
效果