在之前的文章中我们实现了自定义View需要的基本功能,本篇中我们通过 Timer 实现动画功能。我偷偷修改了一些数据结构,一会在下面贴出来。
最终效果图:
动画是通过 Timer 每17毫秒调用 View#post 来调用主线程更新一帧。定义一个 interpolator 使动画效果更自然(逐渐减速的效果)。
首先定义一个存储执行动画相关的数据结构:
private data class AnimInfo(
val block: (percentage: Float) -> Unit,// 每帧调用
val duration: Long = 510,
val progress: Long = 0L,
val done: () -> Unit = {}// 动画结束时调用
)
还有修改过的存储消息相关的数据结构:
data class Message(
val avatar: String,// 头像
val nickname: String,// 昵称
val joinRoom: Int = 1,// 1=加入,其他为退出
var shader: BitmapShader? = null,
var bitmap: Bitmap? = null,
var life: Long = 0L,// 当前时间
val lifeTime: Long = 5000L, // 最大存在时间
)
使用链表来存储 Message 和 AnimInfo 数据:
private val animArr = LinkedList<AnimInfo>()
private val dataArr = LinkedList<Message>()
使用一个 Timer 计时动画及更新 Message 的已存在时间。在 init 方法中初始化:
init {
paint.textSize = fontSize.toFloat()
paint.style =