android path 路径组合 android pathmeasure_Math

 然后我们来看一下PahtMeasure的源码:

一个是无参数构造,通过setPath设置边的长度

另外一个是直接将serPath传到参数进入

android path 路径组合 android pathmeasure_android path 路径组合_02

当setPath等于true的时候:

运行结果:日志打印结果为800,表示矩形的长度是800,

android path 路径组合 android pathmeasure_Math_03

当为false的时候,运行结果是:

android path 路径组合 android pathmeasure_android path 路径组合_04

只获取了三个边的长度: 

android path 路径组合 android pathmeasure_android_05

不管使用哪种构造方法 ,如果对Path进行了调整, 

android path 路径组合 android pathmeasure_android_06

 

android path 路径组合 android pathmeasure_android path 路径组合_07

第二个方法:截取:

android path 路径组合 android pathmeasure_android_08

startD:开始截取的位置:  stopD:结束截取的位置

Demo:

android path 路径组合 android pathmeasure_数据保存_09

mPaint设置的是黑色画笔,mLinePaint设置的是蓝色画笔,测量好了path的长度,然后通过getSegment从200开始,到1000结束,

 

运行结果:

android path 路径组合 android pathmeasure_Math_10

现在给dst路径先添加一条直线;

android path 路径组合 android pathmeasure_android_11

然后我们再来看一结果,不受任何影响

android path 路径组合 android pathmeasure_android_12

如果为StartMoveTo设置成false,

android path 路径组合 android pathmeasure_android_13

去掉直线设置成false,从路径的最后一个点开始连线,而不是从截取的位置开始连线

 

android path 路径组合 android pathmeasure_android path 路径组合_14

 3,跳转到下一条跳转路径

 //跳转到下一条曲线      pathMeasure.nextContour();

android path 路径组合 android pathmeasure_android_15

 运行结果:长度为800,是矩形的长度,而并没有将圆的长度给计算出来

android path 路径组合 android pathmeasure_android_16

 添加 pathMeasure.nextContour();、表示跳转到下一条曲线:

我们看打印的两个结果:

android path 路径组合 android pathmeasure_android path 路径组合_17

第二个打印的是圆的长度

4:是否获取成功:getPosTan  

android path 路径组合 android pathmeasure_android_18

返回值:booean

distance:表示距离path起点的长度   0-path

pos   表示当前点在画布上的位置   将数据保存到这里

tan:当前点在曲线上的方向,(当前点pos与x轴切点的点的坐标  ),通过他可以获取到切线与x轴的夹角    将数据保存到这里

Demo:

 

android path 路径组合 android pathmeasure_android_19

android path 路径组合 android pathmeasure_Math_20

看一下打印的结果:

android path 路径组合 android pathmeasure_android_21

pos【0】【1】:200 表示的是:距离path起点长度为0的这个位置他在画布上的x坐标和y坐标:(200,0)

tan  表示的是当前点在曲线上的切线的点 通过这个点可以获取角度等信息:通过使用

 double  degree= Math.atan2(tan[0],tan[1]) * 180 / Math.PI 计算的是当前切线与x轴夹角的度数

android path 路径组合 android pathmeasure_数据保存_22

android path 路径组合 android pathmeasure_android_23

android path 路径组合 android pathmeasure_android_24

一个小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();


    }



}

 

 

 

 

效果

android path 路径组合 android pathmeasure_android_25