是否可以从 ValueAnimator 创建 AnimatonSet?

Posted

技术标签:

【中文标题】是否可以从 ValueAnimator 创建 AnimatonSet?【英文标题】:Is it possible to create AnimatonSet from ValueAnimator? 【发布时间】:2021-07-07 05:07:43 【问题描述】:

我有一个自定义视图。在这个视图中,我画了 4 个圆圈。这个视图有drawCirclesWithAnim()函数,我想用动画一个一个地画圆。

例如,首先绘制第一个圆圈,然后是第二个,然后是第三个......以此类推。如何通过自定义视图实现这一点?

由于是自定义视图,我认为我唯一的选择是ValueAnimator。目前,为了实现我的需要,我正在创建 4 个ValueAnimators。查看下面的代码:

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?的主要内容,如果未能解决你的问题,请参考以下文章

android动画详解四 创建动画

Android属性动画之ValueAnimator的介绍

android动画具体解释四 创建动画

Android超简单实现金钱滚动效果

安卓插值器(ValueAnimator)

ValueAnimator 源码深入分析