我有两个问题,第一个是简单的:将自定义翻转动画添加到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方式来实现同样的结果。
提前感谢您的帮助。