视图“可见性”更改时,将忽略MotionLayout中的KeyAttribute

时间:2020-03-15 14:46:32

标签: android android-motionlayout

在滑动动画之后,我正在使用MotionLayout<MotionScene />来制作bottomSheet View内容的动画。

我想在开始结束场景之间使用从view_player_status_margingone的可见性显示一个视图visible (不使用alpha,因为另一个视图通过约束链接到我要显示的视图上。)

<Constraint />中使用标准<ConstraintSet />没关系,但是当我将可见性链接到<KeyAttribute />以使视图仅出现在动画的最后一帧时,它不会遵循特定于框架的规则位置。

我对<KeyAttribute />的用法似乎是正确的,因为它适用于其他两个视图的alpha。

KeyAttributevisibility属性一起使用是否有特定的限制?

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

    <Transition
        app:constraintSetEnd="@+id/player_scene_set_expanded"
        app:constraintSetStart="@+id/player_scene_set_collapsed"
        app:motionInterpolator="easeIn">

        <KeyFrameSet>

            <KeyAttribute
                android:visibility="gone"
                app:framePosition="80"
                app:motionTarget="@id/view_player_status_margin" />

            <KeyAttribute
                android:alpha="0"
                app:framePosition="20"
                app:motionTarget="@id/view_player_collapsed" />

            <KeyAttribute
                android:alpha="1"
                app:framePosition="20"
                app:motionTarget="@id/view_player_expanded" />

        </KeyFrameSet>

    </Transition>

    <ConstraintSet android:id="@+id/player_scene_set_collapsed">

        <Constraint
            android:id="@+id/view_player_collapsed"
            android:layout_width="0dp"
            android:layout_height="64dp"
            android:alpha="1"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

        <Constraint
            android:id="@+id/view_player_expanded"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:alpha="0"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/view_player_status_margin"/>

        <Constraint
            android:id="@+id/view_player_status_margin"
            android:layout_width="0dp"
            android:layout_height="38dp"
            android:visibility="gone"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </ConstraintSet>

    <ConstraintSet android:id="@+id/player_scene_set_expanded">

        <Constraint
            android:id="@+id/view_player_collapsed"
            android:layout_width="0dp"
            android:layout_height="64dp"
            android:alpha="0"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

        <Constraint
            android:id="@+id/view_player_expanded"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:alpha="1"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/view_player_status_line" />

        <Constraint
            android:id="@+id/view_player_status_line"
            android:layout_width="0dp"
            android:layout_height="38dp"
            android:visibility="visible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </ConstraintSet>

</MotionScene>

1 个答案:

答案 0 :(得分:1)

我想做这样的事情,作为一个初学者,这让我有些困惑,但是我想分享到目前为止我可以做的事情。

对我来说,我找不到KeyAttribute的{​​{1}},所以我不得不使用visibility

CustomAttribute

以下是<KeyAttribute motion:framePosition="0" motion:motionTarget="@id/background"> <CustomAttribute motion:attributeName="visibility" motion:customIntegerValue="8" /> </KeyAttribute> 的相应整数值:

visibility

因此,出于我的需要,我有一个背景视图,我希望将其Visible = 0 Invisible = 4 Gone = 8 alpha动画到0的动画。当1gone时,背景视图应该为alpha,并且一旦0大于alpha时,就一直保持0,但我根本不需要visible的任何动画。
配置visibility对我来说还不够,我不得不让运动忽略背景视图的动画KeyFrameSet

当然,我必须为visibilityvisibility约束集设置背景视图的@id/start,以下是@id/end演示的所有这些内容:

MotionScene