2

我在 android studio 中使用运动布局来制作一个滚动的页面,看起来有点像 Twitter。我想在动画的最后将包含名称的布局的可见性设置为 GONE。

通常,如果您将其设置为最后消失,它会在动画中逐渐消失。但我希望它突然消失。

我正在使用运动布局并且有点理解关键帧,但是您如何使用可见性来做到这一点?

谢谢。

4

2 回答 2

2

我想在这里留下一个答案,以防有人遇到像我这样的情况:

动画alpha和控制它的框架可以完成这项工作,但是当您希望视图实际上gone来自布局时,我需要利用visibility它。

我在另一篇文章中写了它,但为了便于阅读,将其保留在这里:
背景视图,应该是gonewhen alphais 0,并且 oncealpha变得越来越大,而0不仅仅是一直停留visible,但运动不应该为visibility所有内容设置动画。

  • 配置KeyFrameSetvisibility,所以在第0 帧 visibilitygone,从第 1 帧 visibility开始是visible
  • 在两个和约束集中设置visibility背景视图的必需。@id/start@id/end
  • 在这两个和约束集中设置visibiltyMode为背景视图,因此运动将忽略为背景视图设置此属性的动画。ignore@id/start@id/end
<MotionScene
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        android:id="@+id/transition"
        motion:constraintSetEnd="@+id/end"
        motion:constraintSetStart="@id/start"
        motion:duration="@integer/standard_duration">

       <KeyFrameSet>
           <KeyAttribute
               motion:framePosition="0"
               motion:motionTarget="@id/background">
               <CustomAttribute
                   motion:attributeName="visibility"
                   motion:customIntegerValue="8" />
           </KeyAttribute>

           <KeyAttribute
               motion:framePosition="1"
               motion:motionTarget="@id/background">
               <CustomAttribute
                   motion:attributeName="visibility"
                   motion:customIntegerValue="0" />
           </KeyAttribute>
       </KeyFrameSet>

    </Transition>

    <ConstraintSet android:id="@+id/start">
        ...

        <Constraint
            android:id="@+id/background"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:alpha="0.5"
            android:visibility="gone"
            motion:visibilityMode="ignore"
        />
    </ConstraintSet>

    <ConstraintSet android:id="@+id/end">
        ...

        <Constraint
            android:id="@+id/background"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:alpha="0.5"
            android:visibility="visible"
            motion:visibilityMode="ignore"
        />
    </ConstraintSet>

</MotionScene>

顺便说一句,对应的整数值为visibility

Visible = 0
Invisible = 4
Gone = 8
于 2020-10-29T08:34:10.257 回答
1

您可以为第 0,99 和第 100 帧位置设置 alpha 值,如下所示。

 <KeyFrameSet>

        <KeyAttribute
            android:alpha="1"
            motion:framePosition="0"
            motion:motionTarget="@id/textView" />
        <KeyAttribute
            android:alpha="1"
            motion:framePosition="99"
            motion:motionTarget="@id/textView" />
        <KeyAttribute
            android:alpha="0"
            motion:framePosition="100"
            motion:motionTarget="@id/textView" />

    </KeyFrameSet>

这样,textview 会从第 99 帧到第 100 帧淡出,但看起来几乎是突然消失了。

显示示例动画的 gif 图像

于 2019-08-05T11:43:11.123 回答