Android动画:同步与顺序

时间:2011-08-02 06:32:47

标签: android android-animation android-asynctask

我正在使用两张图片(img_heart_1img_heart_2)。我有两个动画,一个翻译和其他缩放text_anim.xml: animi(Animation)bounce_up.xml :bounce_up_anim(Animation)

  • 顺序:一个接着一个动画。
  • 同步:同时显示两个图像动画。

  • 独家:两个动画(每个图像一个)

  • 包含:只有一个动画(AnimationUtils.loadAnimation(this, R.anim.Same))用于两个图像动画。

结果是连续的和不同的动画,预期的结果。但如果我从secAnim.execute();剪切firstAnimationAsync并放入onResume,则两个动画都会同时播放,只有一次

如果我将secAnim.execute()保留在onResume()中,并将img_heart_2.startAnimation(animi);代替img_heart_2.startAnimation(bounce_up_anim);,则会同时运行一次。

如果我将secAnim.execute()放在onPostExecute()的{​​{1}}并保留firstAnimationAsync两个图片,现在,第一个动画将首次运行,第二个动画将运行

为什么会这样?

此外,如果同时进行两个图像,则第二个图像看起来有点按压(垂直向底部压缩)。我还把startAnimation(animi),(现在评论过)不应该取消该动画吗?

我还希望我的翻译动画坚持结束而不是反弹或变得不可见。

代码: text_anim.xml

da=null

代码: bounce_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    >
        <translate
            android:fromXDelta="0"
            android:toXDelta="50"
            android:fromYDelta="0"
            android:toYDelta="100"
            android:duration="3000"
            android:fillAfter="false"/>


</set>

代码: anidro.java

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
        <scale 
            android:fromXScale="1.0"
            android:toXScale="2.0"
            android:fromYScale="1.0"
            android:toYScale="3.0"
            android:pivotX="50%"
            android:pivotY="0%"
            android:duration="3000"/>   
</set>

2 个答案:

答案 0 :(得分:1)

我知道这是一个老问题,但为了将来参考,您可以使用AnimationSet.Builder

  

Builder对象是一个实用程序类,便于将动画添加到AnimatorSet以及各种动画之间的关系。 Builder方法的意图以及AnimatorSet的play()方法的目的是使以自然方式表达动画的依赖关系成为可能。如果这些方法适合需要,开发人员也可以使用playTogether()和playSequentially()方法,但在某些情况下,可能更容易成对地表达Animator动画集。

     

例如,这会设置一个AnimatorSet来同时播放anim1和anim2,anim3在anim2完成时播放,anim4播放anim3结束时播放:

AnimatorSet s = new AnimatorSet();
s.play(anim1).with(anim2);
s.play(anim2).before(anim3);
s.play(anim4).after(anim3);

答案 1 :(得分:0)

你真的不应该使用ASyncTask进行图形化处理。没人能准确预测何时在系统中执行任务,所以这是一个非常糟糕的主意。

为什么不使用Animation Listener?您只需要创建第一个动画,并添加一个新的动画侦听器,它将在第一个动画的开头或结尾处启动第二个动画。

要使动画无效,只需调用

即可
img_heart.clearAnimation();

为了坚持到底,我不确定你想要什么,但可能你希望你的图像保持在动画结束时的位置,所以,你需要在动画中设置这个属性声明:

android:fillAfter="true"

android:fillBefore="false"
android:fillEnabled="true"

只有fillAfter似乎是强制性的,所以先试试,但如果不起作用,请添加下两行。