Android实现炫酷文字动画效果
龙旋
共 3372字,需浏览 7分钟
· 2021-06-22
效果展示
实现原理
1. 文字路径的获取
文字路径的获取可以通过Paint的getTextPath方法来获取,
2. PathMeasure+Animator实现动画
这里需要通过PathMeasure的构造方法
PathMeasure(tempPath, false)//通过构造方法
PathMeasure().setPath(tempPath, false)//通过setPath方法
mAnimation = ValueAnimator.ofFloat(0f, 1f)
...省略部分代码
mAnimation!!.addUpdateListener {
mCurrentProcess = it.animatedValue as Float
invalidate()
}
mAnimation!!.start()
mPathMeasure!!.getSegment(0F, mPathMeasure!!.length * mCurrentProcess, mDst, true)//获取路径片段(这里的mDst是用来存储截取出来的路径)
canvas!!.drawPath(mDst, mPaint)//绘制路径
3. 文字的换行问
由于使用自定义View绘制文字它不会主动的去换行因此只能通过我们自己计算来让文字换行
这里我们使用Paint的getTextWidths来获取所有字符的宽度,然后通过循环叠加字符的宽度,每当字符的宽度总和大于控件的宽度时我们便进行换行,这里的换行则是存储下当前遍历到的字符的索引值,然后根据这个索引值对整串字符串进行截取来实现。
val textWidths = FloatArray(mText.length + 1)
mPaint.getTextWidths(mText, 0, mText.length, textWidths)
var tempTextWidthSum = 0f
var tempViewWidth = 0//控件的宽度
...省略部分代码
for (i in 0..(textWidths.size - 1)) {
tempTextWidthSum += textWidths[i]
if (tempTextWidthSum >tempViewWidth ) {
mTextLineCountList.add(i)//存储字符的索引值
tempTextWidthSum = textWidths[i]//因为当前已经比控件宽度大了所以在重新计算的时候需要将这个字符的宽度加进去(因为这已经是第二行了)
}
}
mTextLineCountList.add(mText.length)//将最后的字符索引加进去,不然会缺字
控件的使用
为了方便使用我加了几个自定义属性:
<declare-styleable name="PathAnimTextView">
<!--文字颜色-->
<attr name="animTextColor" format="color"/>
<!--文字大小-->
<attr name="animTextSize" format="float"/>
<!--文字画笔宽度-->
<attr name="animTextStrokWidth" format="float"/>
<!--动画文字-->
<attr name="animText" format="string"/>
<!--动画的速度-->
<attr name="animSpeed">
<!--快-->
<enum name="fast" value="0"/>
<!--慢-->
<enum name="slow" value="1"/>
<!--中速-->
<enum name="medium" value="2"/>
</attr>
<!--字体库的名称-->
<attr name="animTextTypeFace" format="string"/>
<!--文字行间距-->
<attr name="animTextLineMargen" format="float"/>
</declare-styleable>
<com.hehuidai.customview.one.animtextview.PathAnimTextView
android:id="@+id/patv"
app:animTextColor="#ff0000"
app:animTextStrokWidth="2"
app:animTextSize="80"
app:animSpeed="fast"
app:animText="Animation TextView"
app:animTextTypeFace="Muyao-Softbrush.ttf"//这里的字体文件需要放到assets文件中
app:animTextLineMargen="0"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
patv.startTextAnim()
patv.setText("Animation TextView")
评论
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
OpenUI:输入一段文字就能生成网!页!!
今天给大家介绍一个开源的 AI 网页生成工具:OpenUI!!!前言 在软件开发领域,用户界面(UI)的设计和构建确实是一个至关重要的环节。传统的 UI 开发需要设计师和开发人员紧密合作,通过反复的设计、修改和测试来达到理想的效果,这个过程往往耗时且成本较高。随着 AI 技术的发展,现在有越来越多的
前端技术江湖
0
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0
超越原生,散点图实现华夫饼图
之前我们介绍过了如何使用新卡片图实现华夫饼图。参考:超越原生,PowerBI 华夫饼图实现但是利用卡片图实现的华夫饼图有一些缺点,形状之间的大小跟间距不太好把握,而且有时形状大一点的话显示就会不正常,需要做出二次调整。今天给大家介绍一种原生视觉对象生成华夫饼图的更佳方案,既简单又美观。上图是利用散点
PowerBI战友联盟
2
全新 SOTA backbone | 2024年了,再见ViT系列Backbone,实数难得,不知道效果如何?
点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达在构建用于精确匹配的深度固定长度表示时,确定指纹上的密集特征点,特别是在像素 Level 上,具有重大意义。为了探索指纹匹配的可解释性,作者提出了一种多阶段可解释的指纹匹配网络,名为通过视觉 Transformer 进行指纹匹配的
小白学视觉
10
Spring Boot + flowable 快速实现工作流
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。来源:blog.csdn.net/zhan107876/article/details/120815560总览一、flowable-ui部署运行二、绘制流程图绘图细节:
Java架构师社区
0
实现订单30分钟自动取消的策略
原文:juejin.cn/post/7285167401821798400简介在电商和其他涉及到在线支付的应用中,通常需要实现一个功能:如果用户在生成订单后的一定时间内未完成支付,系统将自动取消该订单。本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案,并提供实例
JAVA乐园
0
AI大模型之路 第三篇:从零实现词嵌入模型,加深理解!
你好,我是郭震今天我们研究「AI大模型第三篇」:词维度预测,很多读者听过词嵌入,这篇文章解答下面问题:词嵌入是什么意思?怎么做到的?原理是什么?从零实现一个专属你数据集的词嵌入我们完整从零走一遍,根基的东西要理解透,这样才能发明出更好的东西。1 skip-gram模型Skip-gram模型是一种广泛
Python与算法社区
11