使用AnimatorSet

时间:2015-10-08 06:21:40

标签: android animation viewflipper android-adapterview objectanimator

我有两个问题,第一个是简单的:将自定义翻转动画添加到AdapterViewFlipper(其中必须按顺序更改多个属性)的最简单方式是什么,最好是使用XML中定义的值的解决方案。

在第二个问题中,我要求澄清我将首先解释的非常奇怪的行为。

我已经花了几天时间搞乱动画试图动画如上所述的AdapterViewFlipper动画,主要是作为学习练习。我发现可用的方法(从AdapterViewAnimator继承的是setInAnimatior()和setOutAnimatior()都接收ObjectAnimator参数。我理解的是ObjectAnimator(错误地可能?) 只能为每个XML标记或Java实例化动画一个属性(有时同时为x和y属性)。文档显示通常ObjectAnimators被分组为AnimatorSet对象,可以用XML干净地创建,我的问题是让这些AnimatorSet对象为视图转换设置动画。我几乎要创建AdapterViewFlipper的扩展,以便在出现奇怪的事情时尝试解决这个问题。

为了解释,下面是我最初设置动画翻转的尝试之一(我已经将代码简化为单个翻转方向,相反的方向类似于XML“valueFrom”和“valueTo”值的不同):

...
AnimatorSet inLeftSet;
AnimatorSet outLeftSet;

@Override // This is in a fragment
public View onCreateView(...) {
    ...
    inLeftSet = (AnimatorSet) AnimatorInflater.loadAnimator(
        this.getContext(),
        R.animator.card_flip_left_in);
    outLeftSet = (AnimatorSet) AnimatorInflater.loadAnimator(
        this.getContext(),
        R.animator.card_flip_left_out);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        ...
        case (R.id.next_image):
            outRightSet.setTarget(flipper.getCurrentView());
            flipper.showNext();
            inRightSet.setTarget(flipper.getCurrentView());
            outRightSet.start();
            inRightSet.start();
            break;
        ...
    }

相应的XML文件是:

card_flip_right_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:duration="0"
        android:propertyName="alpha"
        android:valueFrom="1.0"
        android:valueTo="0.0"/>
    <objectAnimator
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:propertyName="rotationY"
        android:valueFrom="180"
        android:valueTo="
    <objectAnimator
        android:duration="1"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:valueFrom="0.0"
        android:valueTo="1.0"/>
</set>

card_flip_right_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:propertyName="rotationY"
        android:valueFrom="0"
        android:valueTo="-180"/>
    <objectAnimator
        android:duration="1"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:valueFrom="1.0"
        android:valueTo="0.0"/>
</set>

这不会产生预期的结果(可以从此Tutorial查看所需动画的示例)。相反,最初的ImageView在闪烁之前完全旋转,最后突然显示下一个ImageView而没有动画。

这是一个奇怪的部分,我在onClick()内创建了下一个片段,用于向右旋转(下一个图像),它完全不起作用,ImageView刚刚闪烁到下一个没有动画, BUT < / strong>,当我不小心点击上一张图片(其代码与上面相同)时,它完美地动画了!?!?

Iterator<Animator> iterator = outRightSet.getChildAnimations().iterator();
while (iterator.hasNext()) {
    flipper.setOutAnimation((ObjectAnimator) iterator.next());
    iterator.remove();
}
iterator = inRightSet.getChildAnimations().iterator();
while (iterator.hasNext()) {
    flipper.setInAnimation((ObjectAnimator) iterator.next());
    iterator.remove();
}

最初有更多的代码,因为它是一个测试,但通过反复试验,我确定了使其适用于上述代码段的代码部分。什么比任何事都更奇怪的是,我将onClick()移动到onCreateView()覆盖,就在AnimatorSet对象膨胀之后并且它仍然有效。需要执行一次才能使所有动画按预期向两个方向工作,向左旋转并向右旋转。

虽然我很高兴它有效,但我很担心它有效,因为我不知道为什么它有效。我对测试代码的初衷是尝试通过setOutAnimation()和setInAnimation()方法将AnimatorSet中的每个ObjectAnimator单独传递给AdapterViewFlipper,这是一个我不确定会做任何事情的测试(我很难找到文档中的充分用法解释)现在我真的想了解发生了什么,以及是否有一个更简单,更合适或更容易为他人可能需要工作的我-code方式来实现同样的结果。

提前感谢您的帮助。

0 个答案:

没有答案