【问题标题】:Is it possible to create AnimatonSet from ValueAnimator?是否可以从 ValueAnimator 创建 AnimatonSet?
【发布时间】: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?或者,是否有其他解决方案可以解决此类情况?

【问题讨论】:

    标签: android android-animation animator


    【解决方案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 应该不是问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-03
      • 2017-03-17
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2018-10-15
      相关资源
      最近更新 更多