Android高级-PathMeasure详解

 然后我们来看一下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();


    }



}

 

 

 

 

效果

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值