PathMeasure 重点方法详解(文章有错,待校正)

news/2024/7/10 4:45:02 标签: Android, PathMeasure, getPosTan, getSegment, Path

PathMeasure>PathMeasure__0">PathMeasure>PathMeasure 重点方法详解

最近准备系统学习一下Android知识,Path操作时遇到一个比较难理解的类PathMeasure>PathMeasure,一番研究(百度一下),记录一下自己的理解。在此特别感谢GcsSloop同学的博文,对于 Android 自定义 view 知识写的很好,收益匪浅。博客地址:GcsSloop.com

知识点

时间有限(懒癌犯了~~),PathMeasure>PathMeasure的基本方法像,构造函数getengthsetPath等就不详细介绍了,很简单哟。本期重点两个方法getSegmentgetPosTan

getSegment_7">getSegment方法

boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo)

作用:用于获取 Path 某一片段,获取成功后返回 TRUE。

参数作用
startD开始截取位置距离 Path 起点的长度(非负)
stopD结束截取位置距离 Path 起点的长度
dst截取的 Path 将会添加到 dst 中
startWithMoveToTRUE:保证截取得到的 Path 片段不会发生形变。

使用详解:

startDstopDPath 的绘制顺序有关。

    Path path1 = new Path();
    
    path1.addRect(-200,-200,200,200, Path.Direction.CW);
    
    //设置目标 Path
    Path dst = new Path();
    //创建 PathMeasure>PathMeasure 对象
    PathMeasure>PathMeasure pm = new PathMeasure>PathMeasure(path1,false);
    
    //获取片段
    //作为矩形,绘制起点在左上角
    //当 startD 为0时,起始点在矩形的左上角
    //大于0时,按绘制方向移动对应距离
    pm.getSegment(0,300,dst,true);
    
    canvas.drawPath(dst,paint);

getPosTan_44">getPosTan方法

boolean getPosTan(float distance, float pos[], float tan[])
参数作用
distance距离 Path 起点的长度 取值范围: 0 <= distance <= getLength
pos[]该点的坐标值,pos[0]为x坐标、pos[1] 为y坐标
tan[]该点的正切值,tan[0]对应角度的cos值,对应X坐标。tan[1] 对应角度的sin值,对应Y坐标

使用详解:

distancepos[]比较容易理解,但是tan[]参数让我郁闷了一段时间,看下面的推演图示可能比较容易理解。在这里插入图片描述

说明:
角 A 的正切值 tanA = P.y/P.x
P 点坐标为(P.x,P.y)
P 点的横坐标 P.x = cosA * 斜边
P 点的纵坐标 P.y = sinA * 斜边
所以最后我们的 tanA 的值为tanA=sinA/cosA
所以我们 tan[]数组中存放的分别是 tan[0]=cosAtan[1]=sinA的值。

使用详解:

    //当前进度
    currentPos += 0.005;
    if (currentPos >= 1) {
        //大于1重置
        currentPos = 0;
    }
    Path path = new Path();
    //圆形背景
    path.addCircle(0, 0, 200, Path.Direction.CW);
    
    PathMeasure>PathMeasure pm = new PathMeasure>PathMeasure(path, false);
    //获取当前长度的坐标集合和正切值集合
    pm.getPosTan(pm.getLength()*currentPos,pos,tan);
    
    //根据pos 集合中的位置绘制圆
    canvas.drawCircle(pos[0],pos[1],15,mPaint);
    //绘制背景圆 Path
    canvas.drawPath(path,mPaint);

    //刷新布局  
    invalidate();

对于 tan[]数组,描述的是当前点的切线与 x 轴夹角的tan 值,我们通常结合 Math.atan2方法来计算旋转角度。

下图说明:绿色箭头表示切线,当处于点(2,0)时,切线于水平方向夹角为90°,tan[0]=cos90=0,tan[1]=sin90=1。
所以,getPosTan 方法中 返回的tan[]数组描述的是当前点的切线与水平线夹角的 tan 值。tan[0]为角 A的cos值 , tan[1]为角 A 的 sin 值
对于 Math.atan2方法,是根据传入的x,y 坐标,计算与原点之间的夹角弧度。
即:弧度 A = Math.atan2(P.y,P.x)
P.x 和 P.y 又可以分别用 cosA 和 sinA 来表示。结合 getPosTan 方法我们就可以改成:弧度 A = Math.atan2(tan[1],tan[0])
角度 A = 弧度 A*180/Math.PI
在这里插入图片描述

以上就是对 PathMeasure>PathMeasure 的总结,非常感谢GcsSloop,学到很多。


http://www.niftyadmin.cn/n/1568405.html

相关文章

PendingIntent学习小结

近日为解决android闹钟标签问题&#xff0c;分析了android的DeskClock应用&#xff0c;发现在AlarmReceiver.java类中用PendingIntent封装的Intent&#xff0c;通过putExtra存入alarm值&#xff0c;当标签重新设定时在当前类中值相应发生了改变&#xff0c;然而当通过intent启动…

GreenDao笔记(一)

最近在搜寻好的数据库操作框架&#xff0c;发现GreenDao确实不错&#xff0c;结合项目使用过程&#xff0c;记录下配置细节&#xff0c;以供随时查看 GreenDao 数据库配置 greenDao不做太多介绍&#xff0c;一个很厉害的数据库框架&#xff0c;每秒钟读写高达30000次&#xff…

Android开发中进程等级相关

Android五个进程等级 1、前台进程&#xff08;Foreground process&#xff09;&#xff1a;   用户当前工作所需要的。一个进程如果满足下列任何条件被认为是前台进程&#xff1a; 正运行着一个正在与用户交互的活动&#xff08;Activity对象的onResume()方法已经被调用&…

GreenDao笔记(二)

GreenDao进阶笔记&#xff0c;通过 注解 JAVA 对象描述数据库表结构&#xff0c;以及实现一对多、多对多的联系&#xff0c;简单直接上代码&#xff0c;后面有详细说明 配置代码 Entity public class Soldier{ //人员表Id(autoincrement true)private Long sID;Propertypriva…

mapbox 数据驱动样式

mapbox 数据驱动样式 data-driven styling1. 画面或者带孔的面(FillLayer)1.1 普通面1.2 带孔面 2. 热力图(HeatmapLayer)3. 聚合(Cluster)4. 圆图层(CircleLayer)5. 图层过滤点线面(Filter)6. 弹窗(Info Window)7. 碰撞检测(Collision Detection) data-driven styling 1. 画面…

android 读取文件相关

首先给大家介绍使用文件如何对数据进行存储&#xff0c;Activity提供了openFileOutput()方法可以用于把数据输出到文件中&#xff0c;具体的实现过程与在J2SE环境中保存数据到文件中是一样的。 public void save() { try { FileOutputStream outStrea…

DrawerLayout+CoordinateLayout+CollapsingToolbarLayout 实现AppBar折叠+抽屉效果

本次主要实现两个效果&#xff0c;抽屉效果和 主页AppBar折叠效果。 主页AppBar折叠效果的实现 实现折叠效果&#xff0c;我们用到的是 Support Design Library 包下的 CoordinateLayout、AppBarLayout、CollapsingToolbarLayout布局以及 Behaviors。 CoordinateLayout本质上是…

Android 解析XML文件

在現代技術中不論使用何種語言﹐解析XML文件資料已是很常見的方法﹐XML比起過去的INI格式更有彈性更能描述豐富的資料﹐且做為一種共同性的文件格式更能讓大家有同樣的規範遵詢﹐不會因為獨樹一格的格式使得使用技巧變得多樣而複雜。 在 Android 中解析XML的方式有三種DOM﹑SA…