自定义View之Path测量工具PathMeasure的详解

Android中PathMeasure仿支付宝支付动画 主要为大家详细介绍了Android中PathMeasure仿支付宝支付动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 立即下载

PathMeasure是什么?
PathMeasure是用来对Path进行测量的工具,一般来说PathMeasure是和Path配合着使用的。通过PathMeasure,我们可以知道Path路径上某讴歌点的坐标、Path的长度等的。

PathMeasure有两个构造函数:

//构建一个空的PathMeasure
PathMeasure() 
//构建一个PathMeasure并关联一个指定的创建好的Path
PathMeasure(Path path, boolean forceClosed) 

无参构造函数PathMeasure()在使用前必须调用setPath(Path path, boolean forceClosed)来关联一个Path。其实就是等价于有参数的构造函数PathMeasure(Path path, boolean forceClosed)了。如果关联之后的Path有所更改,那么就需要调用setPath(Path path, boolean forceClosed)重新关联。

PathMeasure常用的API:

setPath(Path path, boolean forceClosed) 
isClosed()
getLength()
getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo)
getMatrix(float distance, Matrix matrix, int flags)
getPosTan(float distance, float pos[], float tan[])
nextContour()

setPath(Path path, boolean forceClosed)

此方法是关联一个预先创建好的Path。第二个参数forceClosed如果为true,并且关联的Path未闭合时,测量的Path长度可能比Path实际长度长一点,因为测量的是Path闭合的长度。但是关联的Path不会有任何变化。

isClosed()

判断关联的Path是否是闭合状态。如果forceClosed为true,那么此方法一定返回true。

getLength()

返回已关联的Path总长度。如果setPath()时设置的forceClosed为true,则返回的值可能会比实际长度的长。

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

截取Path的一段。如果截取成功,则返回true,反之则返回false。

参数备注
startD起点在Path的位置,取值范围0<=startD < stopD<=getLength()
stopD终点在Path的位置,取值范围0<=startD < stopD<=getLength()
dst将截取的path的片段添加到dst中
startWithMoveTo起点是否使用MoveTo,如果为true,则截取的path的第一个点不会变化,截取的path也不会改变,如果为false,则截取的path可能会发生形变。

注:
1.如果截取Path的长度为0,则返回false,大于0则返回true;
2.startD、stopD必须为和法制(0,getLength()),如果startD>=stopD,则返回false;
3.在Android 4.4或之前的版本在开启硬件加速时,绘制可能会不显示,请关闭硬件加速或者给dst添加一个简单的操作,如:dst.rLineTo(0,0)

演示一下:

        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE); //只描边
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(10f);
        paint.setAntiAlias(true); //设置抗锯齿
        paint.setDither(true); //设置防抖动

        //初始化Path并顺时针绘制一个矩形
        Path sourcePath = new Path();
        sourcePath.addRect(300, 300, 800, 800, Path.Direction.CW);
        PathMeasure measure = new PathMeasure();
        measure.setPath(sourcePath, false);
        Log.e("PathMeasure", "measure.getLength():" + measure.getLength());
        canvas.drawPath(sourcePath, paint);

结果:
这里写图片描述

这里写图片描述

现在要截取上图中的下半部分,总长度是2000,中间的部分就是[750,1750]。演示一下:

        //初始化Path并顺时针绘制一个矩形
        Path sourcePath = new Path();
        sourcePath.addRect(300, 300, 800, 800, Path.Direction.CW);
        PathMeasure measure = new PathMeasure();
        measure.setPath(sourcePath, false);
//        Log.e("PathMeasure", "measure.getLength():" + measure.getLength());
//        canvas.drawPath(sourcePath, paint);

        //初始化一个空的Path
        Path dstPath = new Path();
        //截取sourcePath的一部分添加到dstPath中
        measure.getSegment(750, 1750, dstPath, true);
        dstPath.rLineTo(0, 0);//真机刚刚好是4.4版本的,加个简单的操作
        canvas.drawPath(dstPath, paint);

结果:
这里写图片描述

上面代码中的dstPath初始化完之后,并没有内容的,试试有内容的情况:

        //初始化Path并顺时针绘制一个矩形
        Path sourcePath = new Path();
        sourcePath.addRect(300, 300, 800, 800, Path.Direction.CW);
        PathMeasure measure = new PathMeasure();
        measure.setPath(sourcePath, false);
//        Log.e("PathMeasure", "measure.getLength():" + measure.getLength());
//        canvas.drawPath(sourcePath, paint);

        //初始化一个空的Path
        Path dstPath = new Path();
        dstPath.rLineTo(200, 200);
        dstPath.lineTo(800, 200);
        //截取sourcePath的一部分添加到dstPath中
        measure.getSegment(750, 1750, dstPath, true);
        canvas.drawPath(dstPath, paint);

结果:
这里写图片描述

有意思的是,将dstPath的rLineTo()和lineTo()放在getSegment()之后,后面内容的起点就成了getSegment()的终点了。演示一下:

        //初始化Path并顺时针绘制一个矩形
        Path sourcePath = new Path();
        sourcePath.addRect(300, 300, 800, 800, Path.Direction.CW);
        PathMeasure measure = new PathMeasure();
        measure.setPath(sourcePath, false);
//        Log.e("PathMeasure", "measure.getLength():" + measure.getLength());
//        canvas.drawPath(sourcePath, paint);

        //初始化一个空的Path
        Path dstPath = new Path();
        //截取sourcePath的一部分添加到dstPath中
        measure.getSegment(750, 1750, dstPath, true);
        dstPath.rLineTo(200, 200);
        dstPath.lineTo(800, 200);
        canvas.drawPath(dstPath, paint);

结果:
这里写图片描述

再把上面代码中的getSegment()的startWithMoveTo参数改成false会变成什么样呢?演示一下:

          //初始化Path并顺时针绘制一个矩形
        Path sourcePath = new Path();
        sourcePath.addRect(300, 300, 800, 800, Path.Direction.CW);
        PathMeasure measure = new PathMeasure();
        measure.setPath(sourcePath, false);
//        Log.e("PathMeasure", "measure.getLength():" + measure.getLength());
//        canvas.drawPath(sourcePath, paint);

        //初始化一个空的Path
        Path dstPath = new Path();
		//为了易于理解,把这两个方法放回getSegment()前面
        dstPath.rLineTo(200, 200);
        dstPath.lineTo(800, 200);
        //截取sourcePath的一部分添加到dstPath中
        measure.getSegment(750, 1750, dstPath, false);

        canvas.drawPath(dstPath, paint);

结果:
这里写图片描述

和上上结果对比可得出:startWithMoveTo参数为true时,被截取的path片段会保持原状;startWithMoveTo参数为false时,会将截取的path片段的起始点移动到dstPath的终点,以保持dstPath的连续性。

getMatrix(float distance, Matrix matrix, int flags)

距离Path起始点的一段长度distance,通过计算得到该位置坐标并返回一个处理好的矩阵,该矩阵以左上角为旋转点,如果Path不存在或者长度为0,该方法返回false。

参数备注
distance距离Path起始点的距离,取值范围0 <= distance <= getLength()
matrix根据 flags封装matrix,flags不同,存入matrix的就不同
flagsPathMeasure.POSITION_MATRIX_FLAG:位置信息 ,PathMeasure.TANGENT_MATRIX_FLAG:切边信息,方位角信息,使得图片按path旋转。

getPosTan(float distance, float pos[], float tan[])

距离Path起始点的长度distance,通过计算返回该长度在Path上的坐标及该坐标的正切值分别复制给pos[]、tan[]

参数备注
distance距离Path起始点的距离,取值范围0 <= distance <= getLength()
pos[]distance在path上的坐标,即pos[]存的该点的坐标x,y值
tan[]distance在path上对应坐标点在path上的方向,tan[0]是邻边边长,tan[1]是对边边长。通过Math.atan2(tan[1], tan[0])*180.0/Math.PI 可以得到正切角的弧度值。

nextContour()

如果Path有多条曲线组成,且彼此不连接,那么getLength()、getSegment()、getMatrix()和getPosTan()这些方法,都只是针对当前正在操作的。举个例子,Path由多条曲线组成,且彼此不连接,那么getLength()返回的只是当前操作曲线的长度,并不是所有曲线的长度。那么怎么获取下一条曲线的长度呢?这时就得用nextContour()跳转到下一条曲线了,跳转成功返回true,失败就返回false。演示一下:

        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE); //只描边
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(10f);
        paint.setAntiAlias(true); //设置抗锯齿
        paint.setDither(true); //设置防抖动

        Path path = new Path();
        PathMeasure measure = new PathMeasure();
        //绘制一条从(100,100)到(900,100)的直线,长度为800
        path.moveTo(100, 100);
        path.lineTo(900, 100);
        //绘制一条从(100,200)到(500,100)的直线,长度为400
        path.moveTo(100, 200);
        path.lineTo(500, 200);
        measure.setPath(path, false);
        //输出第一条曲线的长度
        Log.e("PathMeasure", "measure.getLength():" + measure.getLength());
        measure.nextContour(); //跳转到下一条曲线
        //输出第二条曲线的长度
        Log.e("PathMeasure", "next measure.getLength():" + measure.getLength());
        canvas.drawPath(path, paint);

输出的结果:
这里写图片描述

扫码关注个人公众号「技术人的日常」:

在这里插入图片描述

车载导航测试,面试常见问题 车载导航测试是汽车软件测试的重要组成部分,涉及验证导航系统的功能、性能、可靠性和用户体验。在面试中,面试官通常会考察候选人的测试思维、问题解决能力和实际经验。以下我将从常见问题类别入手,逐步介绍面试中的高频问题,并提供结构化分析。通过以上结构化准备,你能在面试中自信应对车载导航测试相关问题。用户体验测试关注界面友好性和交互流畅性,安全测试则涉及功能安全和数据隐私。功能测试聚焦于导航核心功能的正确性,如路线规划、位置定位和地图显示。面试官会考察你如何识别、报告和跟踪缺陷,以及熟悉测试工具。 阅读详情

相关推荐

手把手教你配置UEFI Secure Boot:从密钥生成到系统验证(附避坑指南)

本文详细介绍了如何配置UEFI Secure Boot,从密钥生成到系统验证的全过程,包括PK、KEK等关键密钥的生成方法,以及常见问题的解决方案。通过实战案例和避坑指南,帮助用户有效提升系统启动安全性,防止恶意软件植入。

weixin_30776273的博客 340

Path基础之PathMearsure详解

PathMeasure路径测量,用来测量path的工具类。

Silicon_Valley 837

告别虚拟机!在WSL2的Ubuntu里5分钟跑通LVGL v9.2图形界面(附SDL2配置避坑)

本文详细介绍了如何在WSL2的Ubuntu子系统中快速配置LVGL v9.2图形库的SDL2模拟环境,帮助嵌入式开发者在5分钟内跑通第一个图形界面示例。通过WSL2和VSCode的远程开发插件,实现Windows系统下无缝使用Linux工具链,大幅提升开发效率。

weixin_28736335的博客 425

高级UI-Path和PathMeasure

Path是一个工具类,用来记录线条的轨迹路径,然后通过绘制轨迹路径,可以得到各种各样的图案,而PathMeasure是用来对Path进行测量的工具,再Path的运用中,运用最多的就是贝塞尔曲线,也是本文的重点 贝塞尔曲线 贝塞尔曲线就是这样的一条曲线,它是依据四个位置任意的点坐标绘制出的一条光滑曲线 线性公式 给定点P0、P1,线性贝兹曲线只是一条两...

weixin_30562507的博客 386

基于OpenMV与双舵机云台的激光追踪系统实战解析

本文详细解析了基于OpenMV摄像头与双舵机云台的激光追踪系统设计与实现。从硬件选型、图像识别算法到PID控制逻辑,全面介绍了如何构建一个高效稳定的激光追踪系统,并分享了电子设计竞赛中的实战经验与调试技巧。该系统在智能玩具、安防监控及教学演示等领域具有广泛应用前景。

prometheus9mon的博客 261

手把手教你用CANopen SDO报文控制步进电机(附CIA402协议详解)

本文详细解析了如何通过CANopen SDO报文控制步进电机,深入讲解CIA402协议的核心架构、状态机模型及对象字典管理,并提供实战代码示例。从SDO报文构造到多轴同步控制,帮助开发者掌握工业级步进电机的精确控制技术,适用于自动化设备开发。

weixin_33737774的博客 485

AndroidUI之PathMeasure,PathEffect

PathMeasure顾名思义,它是一个path(路径)的测量工具。我们可用通过它的一些API得到当前路径上某个点的坐标,还有夹角等信息,这些信息在自定义控件中都很适用。PathMeasure都会和一个或者多个Path结合使用。先看常用的API。 构造方法 //构造方法1 public PathMeasure() { mPath = null; ...

做一个苦行僧的专栏 598

FH8626V100之开发环境搭建

FH8626V100是富瀚微出的一款带摄像头的方案,开发工具在Linux 上进行。版本 Ubuntu 20.04 64位。

xue_nuo的博客 1万+

Path之PathMeasure 进阶篇

Path & PathMeasure 顾名思义,PathMeasure是一个用来测量Path的类,主要有以下方法: 构造方法 方法名 释义 PathMeasure() 创建一个空的PathMeasure PathMeasure(Path path, boolean forceClosed) 创建 PathMeasure 并关联一个指定的Path(Path需要已经创建完成)。 公共方法 返回值 方法名 释义 void setPath(P.

xifei66的博客 1343

【AI Guide】AI面试攻略只用看这一篇就够了!力争做全网最全的AI面试攻略——大模型(五)Adapter 微调

Adapter 微调(Adapter Fine-tuning)是一种高效的参数高效微调(PEFT)方法。相较于全参数微调(Full Fine-tuning),Adapter 在预训练模型的特定层插入轻量级的可训练模块,而冻结原始模型参数,从而减少计算和存储开销。是缩放因子,控制 Adapter 输出的影响程度。设 Transformer 层的隐藏状态为。为 Adapter 层的可训练参数,为非线性激活函数,如 ReLU。为冻结的预训练模型参数,

AI科研社 182

YOLOv8高级应用实战:多目标跟踪+实例分割+小样本检测(工业/安防场景落地指南)

安防监控中,需要跟踪多个行人的运动轨迹,而不只是框出“这是行人”;工业质检时,要精确分割出零件的缺陷区域(像素级),而不是只给一个粗略的矩形框;罕见场景下(如特殊故障检测、稀有动物识别),只能收集到几十张样本,普通训练方法精度惨不忍睹。我在落地工业安防和质检项目时,把YOLOv8的高级功能摸了个遍,踩过“多目标跟踪遮挡丢帧”“实例分割边缘模糊”“小样本检测过拟合”等一系列坑,最终总结出这套可直接复用的实战方案。多目标跟踪(ByteTrack)、实例分割、小样本检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 750

安卓自定义View进阶-Path之玩出花样(PathMeasure)

本文中虽然后面的内容看起来比较高大上一点,但前面"啰嗦"的废话才是真正的干货,把前面的东西学会了,后面的各种效果都能信手拈来,如果只研究后面的东西,则是取其形,而难以会其意。

GcsSloop 2万+

AUTOSAR SHE 密钥更新协议

依赖内存槽的使用用例,内存槽有不同的保护协议。M2是新的计数值C_ID‘,相应的标志位F_ID',0填充第一个块,以及新的密钥K_ID'的组合的CBC算法加密的消息。例如,我要更新一个MASTER_ECU_KEY, 那么参考上表,我需要知晓Non-volatile的MASTER_ECU_KEY (即授权密文为MASTER_ECU_KEY自己的密文).内存的更新协议分为两部分,第一部分是实际内存更新到发送一个秘密且真实的key到SHE,然后第二部分为验证,即提供给后台一个key更新成功的证据。

weixin_46481662的博客 3276

Android 自定义View 之 Path PathMeasure (一)

Path path常用api moveTo(float x, float y) 移动下一次操作的起点位置 lineTo(float x, float y) 添加上一个点到当前点之间的直线到Path addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path close() 连接第一个点连接到最后一个点,形成一个闭合区域 q

专注Android ,直到世界尽头 1234

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android-自定义view之无所不能的path

自定义view之无所不能的path最近项目中需要完成以下这个需求 UI给我了五张图片,我感觉太浪费了,自定义view完全可以做而且适配起来更加的方便最终实现效果 项目效果 扩展 需要知道技术点在实现这个过程之前,我们需要了解path的一系列的原理(如果你了解path的用法直接跳过)PathMeasure(是一个用来测量Path的类,主要有以下方法) setPath、 isClosed 和 getL

wzgiceman 5万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于PathMeasure分析path测量的问题

说起PathMeasure这Api可能对于大多数刚入门Android不久的开发者来说有点陌生,但是PathMeasure在我们的view中也是有着很重要的地位,他对于贝塞尔曲线(path)的测量有至关重要的作用,下面我们就来讲解下PathMeasure常用的api以及它在path中的作用: PathMeasure类中持有Path对象的引用,在利用pathMesure对path进行相...

EugeneYoung的博客 540

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android path的长度,浅谈Android PathMeasure详解和应用

PathMeasure,顾名思义,就是一个用来测量Path的类,主要有以下方法:构造方法无参构造方法:PathMeasure()创建一个空的PathMeasure,用这个构造函数可创建一个空的 PathMeasure,但是使用之前需要先调用 setPath 方法来与 Path 进行关联。被关联的 Path 必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法...

weixin_39580950的博客 1069

android高级UI之PathMeasure<一>--Path测量基础(nextContour、getPosTan、getMatrix、getSegment)

前言: 在上一次android高级UI之贝塞尔曲线<下>--贝塞尔曲线运用:QQ消息气泡完成了对于贝塞尔曲线绘制的学习,今天准备学习UI绘制中经常会用到的跟Path相关的一些知识,也是很重要,但是你不去专门花时间去研究的话其实理解起来也并不轻松,关于掌握了这个技能之后最终你能做出啥UI效果呢?其实很多,这里先提前把要操练的一个效果贴出来,先来感受一下: 其中圆是使用Paint绘制出来的,而那个箭头是一张静态图片,如果在你没有了解PathMeasure它的使用之前,碰到这样的效果是不是有点

webor2006的博客 2698

Android PathMeasure详细解读

概念 路径测量,一个用来测量Path的工具类 常用API 常用API如Path长度测量,Path跳转,Path片段获取、 构造方法 PathMeasure() PathMeasure(Path path, boolean forceClosed) forceClosedPath决定是否需要闭合 基本代码 public class PathMeasureView exte...

这都是什么 903

android高级UI之PathMeasure<一>--Path测量实战(各种Loading效果)

在上一次android高级UI之PathMeasure<一>--Path测量基础(nextContour、getPosTan、getMatrix、getSegment)已经学习上PathMeasure的基础了,这次则针对它进行一些实际效果的操练加以巩固。 实战:各种Loading效果: Loading一:让箭头图片沿圆轨迹走 效果: 首先来实现在上篇开头所展示的这个效果: 如果对于上一篇的整体基础都了解之后,实现这样沿路径轨迹的效果那就很轻松了。 实现: 1、新建View:

webor2006的博客 1532

PathMeasure 基础

PathMeasure是一个用来测量Path的类 1. 构造方法 (1)无参构造函数 PathMeasure() 用这个构造函数可创建一个空的 PathMeasure,但是使用之前需要先调用 setPath 方法来与 Path 进行关联。 被关联的 Path 必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。 我们创建一个PathM...

tony499074462的博客 313

Android高级UI进阶之路(六) —— PathMeasure-制作路径动画

我们来回顾一下前面 5 篇文章我们讲解的内容,先是从 View 基础 ,事件分发,View 工作流程,然后是 Paint, Canvas 讲解,该篇我们还是分 2 个部分讲解,先是 Path, 然后是 PathMeaure ,如果想做出比较炫的动画,那么必不可少是离不开这 2 个类的,下面还是以 API 的使用和 demo 实战来讲解。

金戈鐡馬 898

Android绘图之PathMeasure(16)

1 PathMeasure概述 首先思考一个问题,任意绘制一条曲线,或者一个圆弧,或者一个不规则图形,又或者利用Path 同时绘制多条曲线,如何获取某个点的坐标,曲线的方向,对于简单的图形根据已知内容很容易得到坐标,对于类似贝塞尔曲线或者不规则图形想要或者坐标,角度信息很困难,今天就来讲解Path中用于获取上述信息的一个工具类。 PathMeasure是一个用来测量Path的工具类,可以从Pat...

lidongxiu0714 3888

android之自定view之(八)----PathMeasure

PathMeasure Android Demo 参考资料 1.Android 自定义View学习(十六)——PathMeasure学习 https://www.jianshu.com/p/ac1250bccd3b/ 2.安卓自定义View进阶-PathMeasure https://www.gcssloop.com/customview/Path_PathMeasure 3.PathMeasur...

hfreeman2008的专栏 363

Android 玩转PathMeasure之自定义支付结果动画

概述 最近在研究Android的路径动画,恕我直言,PathMeasure是个神器,可以帮助我们绘制任意的路径,只要你能draw出来的Path,它都能绘制出来,你可能会问,既然drawPath都可以了,要它何用? PathMeasure的强大之处在于它能够通过根据起点和终点截取某一段路径进行绘制,可以理解为对Path片段的绘制,然你可能还是会说: 但如果再结合属性动画,那简直就可以为...

IT_ZJYANG的博客 849

【Android UI】Path 测量 PathMeasure ③ ( 使用 PathMeasure 绘制沿曲线运动的小球 )

一、使用 PathMeasure 绘制沿曲线运动的小球、 二、代码示例、 三、运行效果

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1126
上一篇: 自定义View中Canvas之Path的详解
下一篇: 自定义View之Region区域
LayneYao
博客等级 码龄10年 449粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值