什么是当前替代ViewAnimator的新选择?

14

背景

我长期以来一直在使用 ViewAnimator/ViewSwitcher

我最常见的用例是从加载阶段切换到内容阶段,或在向导的不同阶段之间进行切换,有时甚至会出现错误阶段。

问题

当我建议将一个好的扩展函数添加到“android-ktx”存储库中 (在此处)时,我被告知:

ViewAnimator 不是我们积极推荐动画视图的API。它基于旧的动画系统,我们不希望在这个库中推广它的使用。

尝试过的方法

我查看了 ViewAnimator 和 ViewSwitcher 的文章,包括 文档。上面并没有说它已经被替换/弃用了,也没有建议使用其他东西代替它。

问题

  1. 什么替代了 ViewAnimator?他说的是过渡效果吗?

  2. 与 ViewAnimator 相比,有哪些优缺点?

  3. 给定一个带有一些视图的 ViewAnimator,如何将其转换为新的解决方案,包括在不同状态之间进行切换?


就个人而言,我更喜欢使用 https://github.com/blipinsk/ViewPropertyObjectAnimator 进行动画设计,因为它稳定且功能强大,并且您可以使用具有流畅 API 的 AnimatorSet。 - EpicPandaForce
@EpicPandaForce 它怎么能完全替代ViewAnimator呢? - android developer
我的 Kotlin 代码看起来像这样:animateTogether( newView.animateFadeIn(), previousView.animateFadeOut() ).start() - EpicPandaForce
@EpicPandaForce 除了这种切换之外,你还在其他情况下使用它吗?它有什么优点? - android developer
3个回答

3

我认为Romain Guy的意思是ViewAnimator使用Animation API,而较新的API被认为是Animator。在文档中,“属性动画与视图动画的区别”中提到了每种API的优缺点和使用场景。

视图动画系统提供了仅动画View对象的功能,因此如果您想要动画非View对象,则必须实现自己的代码来完成。视图动画系统还受到限制,因为它仅公开了View对象的一些方面以进行动画处理,例如View的缩放和旋转,但不包括背景颜色等内容。
视图动画系统的另一个缺点是它仅修改了View的绘制位置,而不是实际的View本身。例如,如果您将按钮动画移动到屏幕上,按钮会正确绘制,但可以单击按钮的实际位置不会改变,因此您必须实现自己的逻辑来处理这个问题。
使用属性动画系统完全消除了这些限制,您可以动画处理任何对象(视图和非视图)的任何属性,对象本身也会被实际修改。属性动画系统在执行动画方面也更加强大。在高级别上,您可以将动画器分配给要动画处理的属性,例如颜色、位置或大小,并可以定义动画的各个方面,例如插值和多个动画器的同步。
但是,视图动画系统的设置时间较短,需要编写的代码较少。如果视图动画可以完成您需要做的所有事情,或者如果您的现有代码已经按照您想要的方式工作,那么无需使用属性动画系统。如果情况需要,同时使用两个动画系统可能是有意义的。

虽然没有直接的方法可以将"ViewAnimator转换为使用更新的方法",因为它内部使用了Animation API。如文档中所述:"如果视图动画可以完成您需要做的一切,或者如果您现有的代码已经按照您想要的方式工作,那么没有必要使用属性动画系统",这就是为什么ViewAnimator没有被弃用的原因。


1
也许有一些状态转换的示例可以展示如何在状态之间切换吗?例如,假设您有一个加载阶段,其中包含一个名为“正在加载X人信息”的TextView和此人的ImageView,在已加载的阶段中,您将在其他位置放置ImageView,并在屏幕上的不同位置放置一个TextView(显示“关于X人的信息”),前一个TextView应该过渡到新的位置。您会如何实现这个过程? - android developer

0

尝试使用AdapterViewAnimatorAdapterViewAnimator 需要为子视图提供适配器,因此可能比ViewAnimator难以使用,但它具有ViewAnimator类中的必需方法,如showNext()setInAnimation(ObjectAnimator)setOutAnimation(ObjectAnimator)。是的,您需要手动将所有动画改写为ObjectAnimator。


AdaprterViewAnimator仅用于AdapterView(ListView、GridView和其他一些视图)。我所问的更为普遍,而旧API的替代方案是什么? - android developer

0

我猜一个可能的替代方案是使用ConstraintLayout的转换,如这里所示。

要实现它,似乎必须使用两个相似的布局,每个视图都具有相同的ID,然后您可以在阶段之间切换,如下所示:

class MainActivity : AppCompatActivity() {
    private var show = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.circuit)
        backgroundImage.setOnClickListener {
            if(show)
                hideComponents() // if the animation is shown, we hide back the views
            else
                showComponents() // if the animation is NOT shown, we animate the views
        }
    }

    private fun showComponents(){
        show = true
        val constraintSet = ConstraintSet()
        constraintSet.clone(this, R.layout.circuit_detail)
        val transition = ChangeBounds()
        transition.interpolator = AnticipateOvershootInterpolator(1.0f)
        transition.duration = 1200
        TransitionManager.beginDelayedTransition(constraint, transition)
        constraintSet.applyTo(constraint)
    }

    private fun hideComponents(){
        show = false
        val constraintSet = ConstraintSet()
        constraintSet.clone(this, R.layout.circuit)
        val transition = ChangeBounds()
        transition.interpolator = AnticipateOvershootInterpolator(1.0f)
        transition.duration = 1200
        TransitionManager.beginDelayedTransition(constraint, transition)
        constraintSet.applyTo(constraint)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接