【问题标题】:TransitionManager.beginDelayedTransition doesn't animate when activity first loads当活动首次加载时,TransitionManager.beginDelayedTransition 没有动画
【发布时间】:2019-04-16 09:26:16
【问题描述】:

我正在通过 TransitionManager 使用带有动画的约束布局。

我有以下两种布局

这是我的main_activity.xml

<android.support.constraint.ConstraintLayout
        android:id="@+id/constraintLayout"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

       <ImageView
            android:id="@+id/image"
            android:layout_width="0dp"
            android:layout_height="160dp"
            android:background="@color/colorPrimary"
            app:layout_constraintTop_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"/>

    <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            android:text="Let's start animating"/>
</android.support.constraint.ConstraintLayout>

这是我的main_activity_alt.xml

<android.support.constraint.ConstraintLayout
        android:id="@+id/constraintLayout"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto">

      <ImageView
            android:id="@+id/image"
            android:layout_width="0dp"
            android:layout_height="160dp"
            android:background="@color/colorPrimary"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"/>

    <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            android:text="Let's start animating"/>
</android.support.constraint.ConstraintLayout>

在我的 MainActivity 中,我想让图像向上滑动,这将是 main_activity_alt.xml

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val constraintSet1 = ConstraintSet()
        constraintSet1.clone(constraintLayout)

        val constraintSet2 = ConstraintSet()
        constraintSet2.clone(this, R.layout.activity_main_alt)

        val transition = ChangeBounds()
        transition.duration = 5000

   val handler = Handler()
        handler.postDelayed({
            TransitionManager.beginDelayedTransition(constraintLayout, transition)
            constraintSet2.applyTo(constraintLayout)
        }, 10)
    }

当上述开始时,图像已经显示。 main_activity.xml 应该隐藏起来,main_activity_alt.xml 将是它的最后安息之地。

但是,当屏幕加载时,它会立即显示 imageview 而没有任何动画

我在上面做错了什么吗?

【问题讨论】:

  • 我认为必须渲染第一个布局,以便您可以动画过渡到第二个布局。尝试在视图创建之后而不是之前做动画
  • 我已将代码添加到 onResume。但是,图像始终会立即显示。

标签: android android-animation android-constraintlayout android-transitions


【解决方案1】:

来自documentation 用于beginDelayedTransition

调用此方法会导致 TransitionManager 捕获场景根中的当前值,然后发布请求以在下一帧运行过渡。届时,场景根目录中的新值将被捕获,变化将被动画化。

在尝试过渡之前,您必须等到布局布局好。有很多方法可以做到这一点,但最简单的方法是发布转换代码,如下所示:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val constraintLayout = findViewById<ConstraintLayout>(R.id.constraintLayout)
    constraintLayout.post {
        val constraintSet1 = ConstraintSet()
        constraintSet1.clone(constraintLayout)
        val constraintSet2 = ConstraintSet()
        constraintSet2.clone(this, R.layout.activity_main2_alt)
        val transition = ChangeBounds()
        transition.duration = 5000
        TransitionManager.beginDelayedTransition(constraintLayout, transition)
        constraintSet2.applyTo(constraintLayout)
    }
}

【讨论】:

  • 实际上,点击处理程序不是问题的一部分,我只是将其添加为测试,并将其从我的问题中删除。实际上,问题是我想让图像在活动开始时向上滑动。
  • @ant2009 好的。我会重新发布。
  • 谢谢,我刚刚使用Handler().postDelayed 发布了我的问题的更新。不确定哪个会更好,但我喜欢你做constraintLayout.post 的想法,我会将此作为正确答案。
  • @ant2009 postDelayed 有点矫枉过正,但应该可以。您只想在初始布局之后执行过渡代码,所以一个简单的帖子就可以了。
  • 继续做领主的工作,谢谢。经过几天的故障排除后救了我。
【解决方案2】:

尝试延迟过渡,以便在过渡开始时第一个布局会膨胀

transition.delay = 300

如果这不起作用,请尝试

Handler().postDelayed({do transition here}, 300)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2011-02-16
    • 2021-04-25
    相关资源
    最近更新 更多