读《PathMeasure之迷径追踪》相关笔记

两路半桥LLC谐振变换器软开关Simulink仿真(模拟谐振参数不同、分裂电容) 内容概要:本文介绍了“两路半桥LLC谐振变换器软开关Simulink仿真”资源包,重点在于基于Simulink平台对两路半桥LLC谐振变换器进行高精度建模与动态仿真,特别考虑了谐振参数不一致及分裂电容等非理想工况对系统性能的影响。该仿真模型不仅涵盖了主电路拓扑、软开关实现机制与谐振网络设计,还深入分析了不同参数配置下系统的启动特性、稳态效率、动态响应及软开关条件的满足情况。通过参数扫描与对比仿真,帮助用户掌握LLC变换器的关键设计要素与优化方法,具备较强的工程指导价值和科研教学意义。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校师生,以及从事高频开关电源、新能源变换器、车载充电机等领域的研发工程师和技术人员。; 使用场景及目标:① 掌握两路并联半桥LLC谐振变换器的建模与仿真方法;② 理解软开关技术在提升变换器效率与降低EMI方面的关键作用;③ 分析谐振参数偏差与分裂电容结构对系统均流特性、增益曲线及软开关范围的影响;④ 支持科研项目中的拓扑验证、控制策略开发与故障工况分析; 阅读建议:建议结合Simulink仿真模型与配套说明文档进行学习,重点关注谐振腔参数设置、驱动时序设计及软开关波形观测;可通过调整谐振电感、电容值或引入参数失配,观察系统行为变化,深入理解LLC变换器的稳定边界与优化设计原则。 立即下载

所阅读博客地址:PathMeasure之迷径追踪,下文简称为《迷径》
另外参考博客:安卓自定义View进阶-PathMeasure、使用DashPathEffect绘制一条动画曲线


1、

在《迷径》中的第一个例子,是实现下图的效果:
这里写图片描述
开始对其中的部分代码不太理解,后来想了一会儿之后想通了,以此记录:

public class PathPainter extends View {
    ...

    public PathPainter(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPathMeasure = new PathMeasure();
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        mPath = new Path();
        mPath.addCircle(400, 400, 100, Path.Direction.CW);
        mPathMeasure.setPath(mPath, true);
        //获取路径的长度,这里即圆的周长
        mLength = mPathMeasure.getLength();
        mDst = new Path();

        //ofLoat() 是从 0 - 1,用来进度
        final ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                //例如,当 mAnimatorValue 值为 0.1f 时,就表示整个圆周长的 10% 位置处(相对于圆的起点位置)
                mAnimatorValue = (float) valueAnimator.getAnimatedValue();
                invalidate();
            }
        });
        valueAnimator.setDuration(2000);
        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
        valueAnimator.start();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mDst.reset();
        // 硬件加速的BUG
        mDst.lineTo(0,0);
        float stop = mLength * mAnimatorValue;
        //虽然被截取的 Path 片段是被添加到 dst 中,而不是每次被覆盖,
        // 但是由于在本次Demo中总是不断截取同一个圆的片段(且片段的长度越来越大直到整个为整个圆的路径),
        // 因此每次添加的片段路径是周期性的,且在前面利用 reset() 清空了上一次的数据,跟覆盖的效果一样
        mPathMeasure.getSegment(0, stop, mDst, true);
        canvas.drawPath(mDst, mPaint);
    }
}

2、

然后是实现下面的动画
这里写图片描述
就只需要将原来的绘制的起点改为如下

float stop = mLength * mAnimatorValue;
float start = (float) (stop - ((0.5 - Math.abs(mAnimatorValue - 0.5)) * mLength));
mPathMeasure.getSegment(start, stop, mDst, true);

其中的关键点就是那个公式,简化之后为:

mLength * (mAnimatorValue - 0.5 + |mAnimatorValue - 0.5|)

当 mAnimatorValue <= 0.5 时, 实际上 start = 0;
当 mAnimatorValue > 0.5 时, start 为 mLength * (2 * mAnimatorValue -1) ,范围为 mLength * (0 , 1] ;

所以在半圈之前,效果跟第一个动图的效果是一样的,但是超过半圈之后,绘制的路径的起点会快速向终点靠近,以致于所绘制的路径越来越短,最后起始点重合。


3、DashPathEffect

DashPathEffect作用是将Path的线段虚线化。

DashPathEffect (float[] intervals, float phase)

对于上面的两个参数,第一个是间隔数组,且数组长度需要 >= 2,长度最后为偶数的,否则最后一个奇数位的会失效。****第二个参数表示偏移长度。接下来就用图片来具体解释一下。

以 new DashPathEffect(new float[]{150,150}, 0); 为例,其中最左边的第一根辅助线的横坐标为第 100,最后一根辅助线的横坐标为第 850(每隔 50 一根辅助线),对应的线段也是从 100 画到 850,在使用了 DashPathEffect 之后就是如下结果:
这里写图片描述
而当把 phase 设置为 50 的时候,即 new DashPathEffect(new float[]{150,150}, 50);,其余条件不变,结果就变成如下:
这里写图片描述
而当把 phase 设置为 100 的时候,,结果就变成如下:
这里写图片描述
然后按照下面的想法想,可能会跟实际的不同,但是按照下面的那样想会容易一点,便于理解第4 节效果图的实现原理:

根据上面的那些图,就可以很直观的展示出参数 phase 的作用,即在从起点画了长度为 new float[]{X,Y} 中 X 的长后,往左偏移回 phase 值的长度,然后开始绘制 Y 长度的空白,再绘制 X 长度的线段,再绘制 Y 长度的空白,以及往复,直到到达终点,之后就不会再绘制了,即使此时空白段还没有开始绘制或者还没有绘制完,一定要记住这里,不然在第 4 节那儿可能会被坑,以为空白线段一定要绘制设定的长度才算。

这这个例子中,先是从第一根辅助线开始到第四根辅助线画出一条线段,即 150 长的线段,但是因为 phase = 100,所以要偏移回(即回退) 100 的长度,即从第四根辅助线退回到第二根,在回退的过程中会抹去已经绘制的线段(用形象的说法就是用橡皮擦擦去),然后从第二根辅助线开始画长度 150 长的空白,再画 150 的线段,如此往复下去。(这样想,下面那一节展示的那个效果图就能想清楚为什么会是那样的效果了)

这里再附上 new DashPathEffect(new float[]{150,150}, 200); 的结果图,其余条件按上述所示:
这里写图片描述
这里就比较特殊了,但本质思想还是没变,先是从第一个辅助线(还是最左边第一根红色的)开始到第四根辅助线画出一条线段,即 150 长的线段,但是因为 phase = 200,所以要偏移回(即回退) 200 的长度,即使回退到了起点也不会停止,直到回退到那条蓝色辅助线(为了体现效果额外加的)那儿为止,然后从该线开始画长度 150 长的空白,再画 150 的线段,如此往复下去。

注意,当 phase 为负数时,则需要变换一下思想。
phase = -50图 1
phase = -200图 2
即虽然实际上线段整体是从左往右画的(即从 100 画到 850),当 phase 为负数时,需要想作是从右画到左(即从 850 到 100),然后以上面图 2 为例,先是从第十六根(即最右边到)红色辅助线开始到第十三根辅助线画出一条线段,即 150 长的线段,但是因为 phase = -200,所以要偏移回(即回退) 200 的长度,即从第十三根辅助线退回到最右边的蓝色辅助线(即偏移回 200),然后从蓝色辅助线开始向左画长度 150 长的空白,再画 150 的线段,如此往复下去,直到第一根辅助线。


4、

然后《迷径》中如下的效果图:
这里写图片描述

首先需要明确的是,三角的画的方向本身就是从左上角那个点开始,然后往下,再拐角往右上,再回到起点。
然后就是利用 ValueAnimator.ofFloat(1, 0),加上下面的核心代码:

fraction = (float) valueAnimator.getAnimatedValue();
mEffect = new DashPathEffect(new float[]{length, length}, fraction * length);
mPaint.setPathEffect(mEffect);

之后不断重绘就行了。
假设三角形周长为600,则 phase 的值就是从 600 减到 0 的,然后利用第 3 点的解释说明去在脑中模拟或者自己用比试试,就能明白这个效果图的原理了。
或者看下面我自己录制的 GIF 图(请忽略做工),其中黑色线段代表实际绘制的线段,白色线段代表回退的效果(假设回退了500,即 phase = fraction * length = 500),紫色线段代表实际空白的绘制。
这里写图片描述

或者是
ValueAnimator.ofFloat(0, 1) + mEffect = new DashPathEffect(new float[]{length, length}, length - fraction * length);

3DGS实战避坑指南:从零搭建到成功训练 本文详细介绍了3D Gaussian Splatting(3DGS)从环境配置到成功训练的实战避坑指南。涵盖git clone的正确使用、依赖安装的隐藏陷阱、CUDA版本兼容性解决方案、首次训练验证、常见报错急救方案、性能优化技巧及可视化调试方法,帮助开发者高效搭建和训练3DGS模型。 阅读详情

相关推荐

飞书组织架构同步至LDAP:实现企业应用统一身份认证的实战指南

本文详细介绍了如何将飞书组织架构同步至LDAP,实现企业应用统一身份认证的实战方案。通过飞书开放平台API与LDAP服务的集成,企业可以大幅减少账号管理工作量,提升IT效率。文章涵盖技术架构设计、密码策略、详细配置步骤及自动化同步实现,特别适合需要统一认证体系的中大型企业。

weixin_29172201的博客 335

SAP中变式的删除

SAP中变式的删除操作: 步骤一: 步骤二: 步骤三:

SAP阿狸 3717

四足机器人通用运动控制策略:强化学习与PD参数优化

运动控制是机器人实现稳定行走和复杂动作的核心技术,其关键在于精确调节关节的刚度和阻尼特性。PD控制器作为基础控制单元,通过比例(P)和微分(D)增益参数直接影响系统响应速度与稳定性。在四足机器人领域,强化学习(RL)通过模拟环境自主学习,能够有效解决传统控制方法难以适应不同形态机器人的痛点。该技术通过非对称Actor-Critic架构,结合状态估计网络和自适应参数采样策略,实现了跨平台的通用运动控制。典型应用包括工业检测、灾害救援等需要高适应性移动能力的场景,其中PD增益优化和形态参数自适应采样成为提升硬件

weixin_30307921的博客 300

PathMeasure之迷径追踪

PathMeasure之迷径追踪Path,不论是在自定义View还是动画,都占有举足轻重的地位。绘制Path,可以通过Android提供的API,或者是贝塞尔曲线、数学函数、图形组合等等方式,而要获取Path上每一个构成点的坐标,一般需要知道Path的函数方法,例如求解贝塞尔曲线上的点的De Casteljau算法,但对于一般的Path来说,是很难通过简单的函数方法来进行计算的,那么,如何来定位任意

eclipse_xu 1万+

知识图谱的数据挖掘与分析

1. 背景介绍 1.1 数据挖掘的崛起 随着互联网的普及和大数据技术的发展,数据挖掘已经成为了计算机科学领域的热门研究方向。数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过计算机科学、统计学、信息论等多学科交叉的方法,挖掘出有用信息和知识的过程。数据挖掘的目标是从数据中发现有

AI天才研究院 1601

本地玩转AI还得靠这个,SillyTavern(酒馆)到底有多强?

SillyTavern是一款本地运行的LLM交互前端,支持文本生成、图像生成、语音合成等功能。它最初是TavernAI的分支,现已独立开发,社区活跃,功能更新频繁。SillyTavern通过前端UI和插件系统连接各种大模型后端,如OpenAI、KoboldAI等,用户可以在本地创建“虚拟酒馆”与各种角色对话。其功能亮点包括角色卡、角色记忆、世界设定、多人聊天室、自定义UI和行为脚本、插件扩展支持等。SillyTavern适合AI创作用户、AI工程师、LLM爱好者和AIGC创作者。它有两个维护分支:relea

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 8056

求图的绝对中心 && 最小直径生成树 MDST

推荐资料http://www.csie.ntnu.edu.tw/~u91029/SpanningTree.html#a7 上次写的二分,http://blog.youkuaiyun.com/haha593572013/article/details/8538216 参考lzqxh写的   : http://www.cnblogs.com/lzqxh/archive/2013/03/05/2944834

努力奋斗才能梦想成真 5606

基于 STM32 的便携式肌电信号采集与疲劳度评估系统设计与实现

本系统以 STM32 单片机为核心控制器,通过肌电电极采集人体骨骼肌表面的 sEMG 信号,经仪表放大、滤波、AD 采样后送入 MCU 进行时域 / 频域特征提取,利用 RMS(均方根)、MPF(中位频率)、MF(平均频率)等指标实时评估肌肉疲劳状态,最终通过 OLED 显示疲劳等级,并支持蓝牙上传至上位机。

weixin_42300449的博客 109

Android画板开发(二) 橡皮擦实现

在上一篇实现了简单的画板功能, 这篇实现橡皮擦功能,首先分析一下应该如何实现,在Andriod有个图像混合(Xfermode)概念,利用这个概念我们就可以实现橡皮擦功能。一、XfermodePaint有一个方法setXfermode(Xfermode),这个方法设置图像的混合模式。参数有三个子类: AvoidXfermode PixelXorXfermode PorterDuffXfermode 前

KeepStudy 9810

世界模型(World Models)进展全景调研(截至 2025-08)

A5) 2019-07(待核验) | C-SWM:Contrastive Structured World Models(Kipf et al.)A6) 2019-07(待核验) | SLAC:Stochastic Latent Actor-Critic(Lee et al.)A3) 2015-12(背景注记,待核验) | Embed to Control(E2C,Watter et al.)Nature 2020)Repro/Code:werner-duvaud/muzero-general(社区)

u013250861的博客 489

项目篇 | 图书管理系统 | 管理员模块 | 概述

图书管理系统管理员模块概述

百栗.的博客 405

Android自定义View基础--PathMeasure 实现Loading动画

每次我觉得学一个知识点都是很枯燥的,为了更好,更快的学习一个知识点,就是先告诉大家这个知识点能实现什么?所以我一般情况下先用最简单的demo给大家展示效果。 按照惯例先上动图 直接上代码 代码中注释很详细 public class PathMeasureView extends View { private Paint mPaint = new Paint(); priva...

yanwenyuan0304的专栏 364

EMC原理-传导(共模、差模)与辐射(近场、远场)详解

本文深入介绍了电磁兼容(EMC)的基本概念,包括EMI和EMS,以及如何处理传导干扰(共模、差模)和辐射干扰(近场、远场)。详细讨论了近场感应、远场辐射的原理,滤波器和屏蔽技术在抑制噪声信号中的作用。此外,探讨了差模和共模干扰的来源、影响及滤除方法,如使用差模电感、电容和共模线圈。最后,提到了穿心电容在滤除高频噪声中的应用。

让你爱上电路设计 3554

Android动画进阶

初始化PathMeasure有两种初始化方式:初始化pathMeasure后,可以通过调用PathMeasure.setPath()函数来将Path和PathMeasure进行绑定。这样就已经初始化完成了,可以调用pathMeasure来返回路径的相关信息。也可以通过PathMeasure的另一个构造函数直接完成初始化。

qq_36828822的博客 1091

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ANDROID开发技术周报 ISSUE#90

新闻 [图]谷歌把电子宠物做成了Android 7.0的彩蛋:90后的回忆 Android 7.0新功能:官方或第三方应用一目了然 教程 理解Android存储系统架构 本文主要介绍跟存储相关的模块MountService和Vold的整体流程与架构设计.MountService:Android Binder服务,运行在system_server...

weixin_30716141的博客 285

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android 自定义view仿支付宝写五褔及播放

本文记录一下实现仿支付宝写五褔及回放的过程。 先看效果如下,没有找到相关的背景图,只能以田字格当作背景。 整个过程分为两部分,一部分是写字,一部份是回放。 该过程主要使用了path和pathmeasure类,在网上有很多写的非常好博文可以参考。 自定义view的源码见文末链接,此处只摘取部分代码记录,以便后续参考和温故。 首先,实现写的过程。 @Override public boolean onTouchEvent(MotionEvent event) { int action = event.

wh义华的专栏 597

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

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

android 向上飘的字符,GitHub - TianRC/AndroidFloatHeart: Android FloatHeart直播飘心动画,贝塞尔曲线。逻辑清晰,如果你需要飘心效果,来看看,...

Android FloatHeartView 直播间飘心效果Rendering:How to use:Gradle1:In the project root directory build.gradlerepositories {//Rely on the warehousemaven { url 'https://jitpack.io' }}}2:The project directory bu...

weixin_26897585的博客 250

闲聊自定义控件之基础——Path

Path在自定义控件里的使用频率也相当的高,使用Path不仅能绘制矩形、圆形等常规图形,还能绘制比较复杂的组合路径。 基本方法 点的相关操作 moveTo:移动到哪一点 lineTo:连接到哪一点 rMoveTo:移动到哪一点(参考点为当前点) rlineTo:连接到哪一点(参考点为当前点) setLastPoint:设置终点位置 close:连接开始的点和末尾的点,使路径闭合 ...

遗忘的星星 1840

ConstraintLayout —— 约束布局 知识点整理

参考文章: 1、Android官方文档 2、约束布局(ConstraintLayout)1.1.2 版本的新特性 3、android ConstraintLayout使用详解 4、Android ConstraintLayout+ConstraintSet实现动画效果 ConstraintLayout 的版本是 1.1.x layout_constraintXXX_toYYYO...

一个有思想的搬运工 1万+

《Git 原理详解及实用指南》阅读笔记

用于记录阅读 Git 原理详解及实用指南 之后的笔记备忘。 git merge some_branch 的意思是将 some_branch 这一分支与 HEAD 指向的某一分支合并, HEAD 指向的可以是 master ,也可以是其他 branch 当只需要合并某一分支的特定部分的 commits 到另一分支时,就可以参考 Git合并特定commits 到另一个分支 这篇文章。根据这篇...

一个有思想的搬运工 5588

RxJava2 学习笔记

有关 RxJava2 的学习笔记 额外参考文章:Android 响应式编程 RxJava2 完全解析 一、给初学者的RxJava2.0教程系列 1、创建的 Observable 和 Observer 的实例,不是一次性的(暂时需要加上某些前提,如在一般情况下),可以被重复使用,如下面代码所示: Observable&lt;Integer&gt; observable = Ob...

一个有思想的搬运工 393

HenCoder系列2-3小节知识点备忘——定制Layout(ViewGroup)的内部布局

本文内容总结自【HenCoder系列2-3小节】,主要用于本人知识点备忘,勿喷! 在看了扔物线大佬的视频之后,觉得有必要把视频中的一些知识点给记录下来,用以备忘,于是屁颠屁颠来写了。 在定制 Layout(ViewGroup)的时候,因为这种布局控件不必绘制自身,所以只需要关注 onMeasure() 和 onLayout() 方法。 一、重写 onMeasure() 在第...

一个有思想的搬运工 370

RxJava2 学习笔记 (二)

1、compose 操作符 compose 是用于复用的,可以把几个常用的操作函数封装为一个函数来复用代码,但是需要结合 ObservableTransformer 来使用的(在 RxJava2 中) 参考文章(使用的还会 RxJava1 的逻辑,会有差异): RxJava中操作符组合的复用利器compose() RxJava 的 compose() 操作函数实战 演示代码如下: 比如...

一个有思想的搬运工 343

Android动画——Tween Animation 相关文档整理

Tween Animation 即补间动画,是属于 View Animation 的一种,可以参考 谷歌文档《Animation Resources》。 而补间动画的一个特征就是 View 控件在因补间动画发生改变之后(如发生位移等),但是 View 对应的点击事件等还是在未改变时位置才能被触发,这个就可以与属性动画比较,因为补间动画只是在视觉上使 View 的显示位置发生了改变,但是实际属性没...

一个有思想的搬运工 312

利用已有Layout,减少开发逻辑

如果在开发过程中,需要自定义 ViewGroup,但是该 ViewGroup 重点不在于子 View 如何布局,而是对子 View 进行某些动画操作,这样的话如果单纯的继承 ViewGroup 再完全实现 onLayout() 等逻辑的话,就会很麻烦,这个时候,就可以继承已有布局,减少开发的逻辑。 就像在《贝塞尔曲线实战–BackgroundView》一文中需要的那种效果(如图): 而博主...

一个有思想的搬运工 290

单例模式——相关博文收集

Android设计模式之单例模式 使用具体的代码讲解如何实现单例模式 那些年,我们一起写过的“单例模式” 有深度的分析各种单例模式的实现的区别利弊,包括详细的分析了涉及单例模式的反射、反序列化等相关问题 ...

一个有思想的搬运工 269
上一篇: 利用已有Layout,减少开发逻辑
下一篇: RxJava2 学习笔记
OneDeveloper
博客等级 码龄9年 61粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值