是否可以从 ValueAnimator 创建 AnimatonSet?
Posted
技术标签:
【中文标题】是否可以从 ValueAnimator 创建 AnimatonSet?【英文标题】:Is it possible to create AnimatonSet from ValueAnimator? 【发布时间】:2021-07-07 05:07:43 【问题描述】:我有一个自定义视图。在这个视图中,我画了 4 个圆圈。这个视图有drawCirclesWithAnim()
函数,我想用动画一个一个地画圆。
例如,首先绘制第一个圆圈,然后是第二个,然后是第三个......以此类推。如何通过自定义视图实现这一点?
由于是自定义视图,我认为我唯一的选择是ValueAnimator
。目前,为了实现我的需要,我正在创建 4 个ValueAnimator
s。查看下面的代码:
CustomView.kt
private var mAnimValCircle1 = 0f //These values are used in "onDraw()".
private var mAnimValCircle2 = 0f
private var mAnimValCircle3 = 0f
private var mAnimValCircle4 = 0f
...
fun drawCirclesWithAnim():
ValueAnimator().apply
duration = 200
addUpdateListener
mAnimValCircle1 = it.animatedValue as Float
invalidate()
setFloatValues(0f, 1f)
start()
ValueAnimator().apply
startDelay = 200
duration = 150
addUpdateListener
mAnimValCircle2 = it.animatedValue as Float
invalidate()
setFloatValues(0f, 1f)
start()
ValueAnimator().apply
startDelay = 350
duration = 150
addUpdateListener
mAnimValCircle3 = it.animatedValue as Float
invalidate()
setFloatValues(0f, 1f)
start()
ValueAnimator().apply
startDelay = 500
duration = 150
addUpdateListener
mAnimValCircle4 = it.animatedValue as Float
invalidate()
setFloatValues(0f, 1f)
start()
如您所见,我正在手动计算延迟并确保每个动画在前一个动画完成后开始。不仅如此,我还在为每个圈子创建ValueAnimator
。它工作正常。但我认为这不是完美的解决方案。
有没有办法从ValueAnimator
创建AnimationSet
?或者,是否有其他解决方案可以解决此类情况?
【问题讨论】:
【参考方案1】:我不知道使用 AnimationSet 和 ValueAnimator 的方法,也不相信开箱即用,但您可以做的是在函数中使用参数并编写一种方法来处理它全部,然后摆脱大量不必要的代码,例如:
fun drawCircleWithAnim(mAnimValCircle: float, duration: Int, startDelay: Int)
ValueAnimator().apply
startDelay = startDelay
duration = duration
addUpdateListener
mAnimValCircle = it.animatedValue as Float
invalidate()
setFloatValues(0f, 1f)
start()
然后像这样调用 4 次:
drawCircleWithAnim(mAnimValCircle1, 200, 0)
drawCircleWithAnim(mAnimValCircle2, 150, 200)
drawCircleWithAnim(mAnimValCircle3, 350, 150)
drawCircleWithAnim(mAnimValCircle4, 500, 150)
除非您正在寻找超微优化,否则创建 4 个 ValueAnimator 应该不是问题。
【讨论】:
以上是关于是否可以从 ValueAnimator 创建 AnimatonSet?的主要内容,如果未能解决你的问题,请参考以下文章