Android视图动画无法链接两个相同类型的动画

时间:2014-11-28 01:25:48

标签: android animation

我正在尝试链接两个相同类型的View Animations,在本例中为alpha。最初,我希望我的View在向左平移时淡出,然后在完成后,View应该在屏幕中央淡入。

我可以让动画滑动并向左淡化,但是,当我尝试添加淡入动画后,没有动画发生时,alpha突然变为0.2。我尝试过玩fillAfterfillBefore,但这些似乎没有什么区别。据我所知,View Animation对View的实际属性没有影响。到目前为止,这是我的代码:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillBefore="false"
    android:fillEnabled="true"
    android:shareInterpolator="false">

    <translate
        android:duration="450"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p" />

    <alpha
        android:duration="450"
        android:fromAlpha="1.0"
        android:toAlpha="0.2" />

    <alpha
        android:duration="450"
        android:fromAlpha="0.2"
        android:toAlpha="1.0"
        android:startOffset="450" />
</set>

我知道我可以使用动画侦听器达到预期的效果,但是,在我看来,只有XML的解决方案会更优雅。

2 个答案:

答案 0 :(得分:3)

在android fillAfter和fillBefore中的

有点棘手。让我们尝试遵循他们的逻辑:

fillAfter =在动画发生后应用更改

好吧,那很容易......但是填充之前究竟是什么?

fillBefore =在动画开始之前应用一些动画值

因此,在您的示例中,从您的集合中移除fillBefore并进行以下更改的一次

    <!-- fillAfter = true -->
    <!-- after animation complete don't change opacity back to 1.. let it remain 0.2  -->
    <alpha
    android:duration="450"
    android:fillAfter="true"  
    android:fromAlpha="1.0"
    android:toAlpha="0.2" />

    <!-- fillBefore = true -->
    <!-- before animation starts set alpha to 0.2  -->
    <alpha
    android:duration="450"
    android:fillBefore="true"
    android:fromAlpha="0.2"
    android:toAlpha="1.0"
    android:startOffset="450" />

你不需要两者 - 只是为了在你的案例中显示这些命令的含义

编辑:只是为了证明这可以做到:)

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillEnabled="true"
    android:shareInterpolator="true" >

    <translate
        android:duration="450"
        android:fillAfter="false"
        android:fillEnabled="true"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p" />

    <alpha
        android:duration="450"
        android:fillAfter="false"
        android:fillEnabled="true"
        android:fromAlpha="1.0"
        android:toAlpha="0" />

    <alpha
        android:duration="450"
        android:fillAfter="true"
        android:fillBefore="false"
        android:fromAlpha="0.2"
        android:startOffset="450"
        android:toAlpha="1.0" />

</set>

答案 1 :(得分:0)

ymz's回答得到了我90%的方式,但是为了获得理想的效果,我必须进行两次更改。主要问题是跳过了第一个淡出动画,为了解决这个问题,我做了以下修改:

  1. fillEnabled="true"中删除AnimationSet属性。我不知道为什么,但是如果在Set而不是它的子节点上将此属性设置为true,那么第一个alpha(淡出)动画将无法工作。它只会跳到第二个alpha动画上的fromAlpha值(淡入)。
  2. fillEnabled=true属性添加到第二个(淡入)Alpha动画。这是因为我们需要将fillBefore设置为false(因为docs fillBefore将被忽略,除非fillEnabled设置为true)。
  3. 最终解决方案如下:

    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
    
        <translate
            android:duration="800"
            android:fillAfter="false"
            android:fillEnabled="true"
            android:fromXDelta="0%p"
            android:toXDelta="-100%p"
            android:startOffset="0"/>
    
        <alpha
            android:duration="800"
            android:fillAfter="false"
            android:fillEnabled="true"
            android:fromAlpha="1"
            android:toAlpha="0"
            android:startOffset="0"/>
    
        <alpha
            android:duration="800"
            android:fillAfter="true"
            android:fillEnabled="true"
            android:fillBefore="false"
            android:fromAlpha="0.1"
            android:startOffset="800"
            android:toAlpha="1.0" />
    </set>