// 添加MavenCentral源
repository { mavenCentral() }
// 引入远程依赖
implementation("com.kotlincrow.android.component:AttrTextLayout:1.8")-
支持配置文本策略、样式、换行(手动、自动)、特效(擦除、移动、圆形、连续、非连续) 动画
-
支持XML和动态创建
-
优化绘制速度 < 3MS
-
增加渐变色
-
增加高刷新率动画(仅支持左右移动、上下移动、可控制速度、Speed为8时效果最佳)
-
配置字体类型
-
配置边框
-
启用(单列、多列)垂直文字
-
启用文字描边、阴影
-
配置渐变色RGB
-
用的GIF进行录制会很卡顿,实际效果非常顺畅
-
高刷的移动速度较慢,但在像素级视图中做到了和OpenGL ES同等的效果,非常顺畅,可参考关于高刷动画说明
![]() |
![]() |
|---|---|
| MoveX-HighBrushing - X轴高刷移动 | Update-MoveX - X轴方向移动时更新文本 |
![]() |
![]() |
|---|---|
| MoveY-HighBrushing - Y轴高刷移动 | MoveY-HighBrushing - Y轴高刷移动 - DEBUG |
![]() |
![]() |
|---|---|
| Continuation-EraseX - X轴向左连续擦除 | Continuation-EraseX - X轴向左连续擦除 - DEBUG |
![]() |
![]() |
|---|---|
| Continuation-EraseYTop - Y轴向下连续擦除 | Continuation-EraseYTop - Y轴向下连续擦除 - DEBUG |
![]() |
![]() |
|---|---|
| Continuation-Oval - 连续圆形时钟 | Continuation-Oval - 连续圆形时钟 - DEBUG |
![]() |
![]() |
|---|---|
| Continuation-Rhombus - 连续菱形 | Continuation-Rhombus - 连续菱形 - DEBUG |
![]() |
![]() |
|---|---|
| Continuation-Oval - 连续十字扩展 | Continuation-Oval - 连续十字扩展 - DEBUG |
![]() |
![]() |
|---|---|
| Center - 中心缩放 | Center - 中心缩放 - DEBUG |
![]() |
![]() |
|---|---|
| Move X - X轴左向移动 | Move X - X轴左向移动 - DEBUG |
![]() |
![]() |
|---|---|
| Move Y - Y轴向上移动 | Move Y - Y轴向上移动 - DEBUG |
![]() |
![]() |
|---|---|
| Fade - 淡入淡出 - 异步 | Fade - 淡入淡出 - 异步 - DEBUG |
![]() |
![]() |
|---|---|
| Fade-Sync - 淡入淡出 - 同步 | Fade-Sync - 淡入淡出 - 同步 - DEBUG |
// 创建AttrTextLayout对象
val layout = AttrTextLayout(this)
// 设置字体大小
layout.mTextSize = 14f
// 设置文本居中
layout.mTextGravity = AttrTextLayout.GRAVITY_CENTER
// 设置文本渐变方向为垂直
layout.mTextGradientDirection = AttrTextLayout.GRADIENT_VERTICAL
// 启用单行文本动画 (如果使用的是连续动画,那么很难能看出动画效果,实际上正在执行,后续优化)
layout.mSingleTextAnimationEnable = true
// 禁用多行文本
layout.mTextMultipleLineEnable = false
// 设置停留时间
layout.mTextResidenceTime = 3000
// 设置文本动画模式,这里使用的是连续X轴擦除动画
layout.mTextAnimationMode = AttrTextLayout.ANIMATION_CONTINUATION_ERASE_X
// 禁用左侧文本动画
layout.mTextAnimationLeftEnable = false
// 禁用顶部文本动画
layout.mTextAnimationTopEnable = false
// 禁用等宽字体
layout.mTextMonoSpaceEnable = false
// 禁用粗体
layout.mTextBoldEnable = false
// 禁用虚粗体
layout.mTextFakeBoldEnable = false
// 禁用抗锯齿
layout.mTextAntiAliasEnable = false
// 禁用斜体
layout.mTextItalicEnable = false
// 禁用虚斜体
layout.mTextFakeItalicEnable = false
// 设置尺寸策略为PX 或 默认
layout.mTextSizeUnitStrategy = AttrTextLayout.STRATEGY_DIMENSION_PX_OR_DEFAULT
// 设置文本渐变方向为斜向
layout.mTextGradientDirection = AttrTextLayout.GRADIENT_BEVEL
// 设置文本更新策略为全部更新
layout.mTextUpdateStrategy = AttrTextLayout.STRATEGY_TEXT_UPDATE_ALL
// 设置文本动画更新策略为连续更新
layout.mTextAnimationStrategy = AttrTextLayout.STRATEGY_ANIMATION_UPDATE_CONTINUA
// 设置行间距
layout.mTextRowMargin = 4f
// 设置字符间距 (此功能只在Android 5.0 +(API 21 +) 才支持)
layout.mTextCharSpacing = 1f
// 设置滚动速度 最大15 最小1 -- 高刷动画 速度为8的时候 达到了高刷的最佳效果,甚至比OpenGL ES的效果看上去好了一点
layout.mTextAnimationSpeed = 13
/*
1. 开启多行时生效
2. 当高度为 `wrap` 只显示三行。
3. 当高度为 `match或固定高度` 并且文本刚好满足两行时,只显示两行。
*/
layout.mTextLines = 3
// 设置字体类型 Assets目录下的字体文件(mTextFontAssetsPath 的优先级大于 mTextFontAbsolutePath)
layout.mTextFontAssetsPath = "comic.ttf"
// 存储中字体文件的绝对路径
layout.mTextFontAbsolutePath = "/data/data/com.crow.attrtextlayout/files/font/calibri.ttf"
// 设置边框
layout.mTextFrameConfig = AttrTextFrameConfig(mLeft = true, mTop = true, mRight = true, mBottom = true, mGradient = AttrTextLayout.GRADIENT_BEVEL)
// 设置文本内容(设置后会自动更新,前提你得吧这个layout添加到您的视图里面,直到您添加完成mText也会自动生效,除非不设置)
layout.mText = "Hello World!"
/**
* ⦁ 重新加载更新策略:当重新绘制的时候是否重新执行动画
*/
const val STRATEGY_ANIMATION_UPDATE_RESTART: Short = 602
/**
* ⦁ 默认更新策略:当重新绘制的时候继续执行已停止的动画
*/
const val STRATEGY_ANIMATION_UPDATE_CONTINUA: Short = 603
/**
* ⦁ PX策略 和 DP策略
*/
const val STRATEGY_DIMENSION_PX_OR_DEFAULT: Short = 604
const val STRATEGY_DIMENSION_DP_OR_SP: Short = 605
/**
* ⦁ 默认更新策略:当文本发生改变触发绘制需求时会直接更新绘制视图
*/
const val STRATEGY_TEXT_UPDATE_ALL: Short = 900
/**
* ⦁ 懒加载更新策略:当文本发生改变时 视图正在执行动画则不会更新,否则更新所有视图
*/
const val STRATEGY_TEXT_UPDATE_LAZY: Short = 901
/**
* ⦁ 文本更新策略:当文本发生改变时,只会更新当前视图的文本(不管动画是否停止执行都会进行更新)
*/
const val STRATEGY_TEXT_UPDATE_CURRENT: Short = 902<!-- textFontAssetsPath 的优先级大于 textFontAbsolutePath -->
<com.crow.attr.text.AttrTextLayout
android:id="@+id/attrTextLayout"
android:layout_width="match_parent"
android:layout_height="320dp"
android:layout_gravity="center"
app:singleTextAnimationEnable="true"
app:textAnimationMode="move_x"
app:textAnimationStrategy="continua"
app:textAnimationX="left"
app:textAnimationY="top"
app:textAntiAliasEnable="true"
app:textBoldEnable="false"
app:textFontAssetsPath="comic.ttf"
app:textLines="3"
app:textFontAbsolutePath="/data/data/com.crow.attrtextlayout/files/font/calibri.ttf"
app:textFakeBoldEnable="false"
app:textItalicEnable="false"
app:textCharSpacing="20dp"
app:textColor="@color/white"
app:textGradientDirection="vertical"
app:textGravity="center"
app:textFrameBottom="true"
app:textFrameLeft="true"
app:textFrameLineWdith="1sp"
app:textFrameRight="true"
app:textFrameTop="true"
app:textFrameGradient="bevel"
app:textFrameColor="@android:color/holo_red_light"
app:textMonoSpaceEnable="true"
app:textMultipleLineEnable="true"
app:textResidenceTime="3000"
app:textRowMargin="1px"
app:textAnimationSpeed="15"
app:textSize="40sp"
app:textSizeUnitStrategy="defaultOrSp"
app:textUpdateStrategy="all" />(1.5)版本引入了X轴高刷新率动画。在Android中,动画ValueAnimator用于完成数值A-B的匀速插值(假设0-1024),
以实现对View的动画表现。但是,如果动画时间较快,就会导致在这个期间内0-1024不能以+1+1的形式表示,
在像素级视图中就会出现丢帧的情况。 为了实现高刷新率,可以考虑使用OpenGL ES绘制的文本,
但是性能开销十分明显。
(1.5、1.6)版本采用了协程机制为自定义View的高刷新进行了对应的处理,
也确保视图能在16MS内绘制完成而不会造成卡顿,从而实现和OpenGLES一样的效果,即不会出现丢帧。)
(1.7)版本移除了三方协程库、纯View无三方依赖
上述对纯View实现高刷的这两种实现的缺点是牺牲丢帧换来卡顿(这种情况只有在视图界面资源占用高的情况出现),
性能开销也很大,并且视图多也会卡,这点没法优化。 如果想在像素级视图中使用高刷新获得顺畅的体验,
那么可以考虑使用高刷新率动画特效,在日常使用中默认的即可。























