Android MotionLayout autoTransition 在 beta7 中不起作用

Posted

技术标签:

【中文标题】Android MotionLayout autoTransition 在 beta7 中不起作用【英文标题】:Android MotionLayout autoTransition not working in beta7 【发布时间】:2020-10-16 11:18:32 【问题描述】:

我想在我的片段显示时自动启动动画。我已将autoTransition 属性设置为animateToEnd,但没有任何反应。 我目前正在使用 constraintLayout beta7。当降级到 beta6 或更低时,除了片段进入屏幕时动画完成之外,什么也没有发生。 我已经将一个 TransitionListener 附加到 MotionLayout 并观察到以下内容:

在 beta7 上 OnTransitionChange 被调用一次,进度值如此之低,我将其称为 0,永远不会调用 OnTransitionEnd 并且我的 TextView 保持不可见 在 beta6 或更低版本 OnTransitionChange 被调用两次,第一次的进度值相当随机,介于 0 和 0.5 之间,第二次是 1.0。之后,调用 OnTransitionEnd 并且我的 TextView 立即可见,那里没有动画。

这是 MotionScene xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetEnd="@+id/end"
        motion:constraintSetStart="@id/start"
        motion:duration="1000"
        motion:motionInterpolator="easeInOut"
        motion:autoTransition="animateToEnd">
    </Transition>

    <ConstraintSet android:id="@+id/start">
        <Constraint android:id="@id/splash_head_TextView">
            <Layout
                android:layout_
                android:layout_
                motion:layout_constraintEnd_toEndOf="parent"
                motion:layout_constraintStart_toStartOf="parent"
                motion:layout_constraintTop_toTopOf="@id/topGuideLine"/>
            <CustomAttribute
                motion:attributeName="alpha"
                motion:customFloatValue="0.0" />
        </Constraint>

    </ConstraintSet>

    <ConstraintSet android:id="@+id/end">
        <Constraint android:id="@id/splash_head_TextView">
            <Layout
                android:layout_
                android:layout_
                android:text="@string/splash_head"
                motion:layout_constraintEnd_toEndOf="parent"
                motion:layout_constraintStart_toStartOf="parent"
                motion:layout_constraintTop_toTopOf="@id/topGuideLine"/>
            <CustomAttribute
                motion:attributeName="alpha"
                motion:customFloatValue="1.0" />
        </Constraint>
    </ConstraintSet>
</MotionScene>

【问题讨论】:

有时使用 beta7 可以工作。 10 次中有 1 次。使用 beta 4 就可以了。 【参考方案1】:

我不知道为什么它不起作用。 但我确实看到了一些错误/可以改进的地方。

android:text="@string/splash_head" 不是布局命令 Α 是做 alpha 的更好方法

既然没有其他改变,这应该就是你所需要的。

<Transition
    motion:constraintSetEnd="@+id/end"
    motion:constraintSetStart="@id/start"
    motion:duration="1000"
    motion:autoTransition="animateToEnd">
</Transition>
<ConstraintSet android:id="@+id/start">
    <Constraint android:id="@id/splash_head_TextView">
       <PropertySet android:alpha="0.0" > 
    </Constraint>

</ConstraintSet>

<ConstraintSet android:id="@+id/end">
    <Constraint android:id="@id/splash_head_TextView">
       <PropertySet android:alpha="1.0" > 
    </Constraint>
</ConstraintSet>

【讨论】:

我根据你的建议重构了我的代码(看起来更干净了)。但是动画仍然没有开始...... @walli 当开始约束集设置为app:currentState="@+id/start" 或使用transitionToState(R.id.start) 移动到时,它在beta6 中对我有用。似乎实际上刚刚在 beta7 中被打破。如果它仍然不适合您,介意分享您的布局吗?

以上是关于Android MotionLayout autoTransition 在 beta7 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android新控件MotionLayout介绍

Android新控件之MotionLayout 动画管理布局简单介绍<一>

android MotionLayout从入门到实战..

android MotionLayout从入门到实战..

未调用 Android MotionLayout 过渡侦听器

带有 MotionLayout 的 Android 折叠工具栏 - 当 RecyclerView 为空/不可滚动时禁用运动