【问题标题】:Android Animation one after otherAndroid动画一个接一个
【发布时间】:2010-08-19 07:39:35
【问题描述】:

我在 TextView 上有两个 TranslateAnimation,我希望它们一个接一个地执行。但是,通过使用下面的代码,只会执行第二个。

我该如何解决这个问题?

TranslateAnimation animation = new TranslateAnimation(
    Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
    Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, -150.0f);
animation.setDuration(200);
wave.startAnimation(animation);

TranslateAnimation animation1 = new TranslateAnimation(
    Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
    Animation.ABSOLUTE, 150.0f, Animation.ABSOLUTE, 0.0f);
animation1.setDuration(200);
wave.startAnimation(animation1);

【问题讨论】:

标签: android animation


【解决方案1】:

将它们链接在一起 Animation Set

AnimationSet as = new AnimationSet(true)
TranslateAnimation animation = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, -150.0f);
animation.setDuration(200);
as.addAnimation(animation);

TranslateAnimation animation1 = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
Animation.ABSOLUTE, 150.0f, Animation.ABSOLUTE, 0.0f);
animation1.setDuration(200);
animation1.setStartOffset(200);
as.addAnimation(animation1);

wave.startAnimation(as);

【讨论】:

  • 这太棒了。然而,这似乎只为一个对象序列化动画。如果你必须为不同的对象序列化动画,你将不得不使用不同的方法。
  • 这对我有用,但是顺序不对,我先放的动画第二,怎么解决?
【解决方案2】:

编辑: Andy Boots 下面的答案是 imo 更好的答案。


只要像这样设置你的第一个,它就会在动画结束后启动另一个:

animation.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            wave.startAnimation(animation1);

        }
    });

edit:使用当前代码仅执行第二个动画的原因是因为它覆盖了第一个动画的播放(实际上都播放了,但您只看到最新的开始)。如果您确实像我写的那样,它们将按顺序播放而不是并行播放。

【讨论】:

  • 谢谢 试过了,它可以按我的意愿工作......但只是好奇,还有其他更好的方法吗?
  • 谢谢。它适用于我正在寻找的方式。 . .
  • “只要设置你的第一个 leik dis n' 它就会开始” - 该死的......去上学。 :)
【解决方案3】:

您也可以通过 XML 本身使用 android:startOffset 属性来执行此操作,并且有一个示例:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:duration="300"
        android:fromXScale="0%"
        android:fromYScale="0%"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="100%"
        android:toYScale="100%" />
    <alpha
        android:duration="300"
        android:fromAlpha="0"
        android:toAlpha=".5" />
    <alpha
        android:duration="300"
        android:fromAlpha=".5"
        android:startOffset="300"
        android:toAlpha="1" />

</set>

【讨论】:

    【解决方案4】:

    还有另一种方法可以实现这一目标,当您需要一个接一个地为大量视图设置动画时,该方法会很有用。您可以使用setStartOffset 方法在动画开始之前设置延迟。因此,如果您知道第一个动画结束需要多长时间,您可以将其设置为第二个动画的延迟。这是一个示例,我在它们下面依次为六个ImageButtons 和六个TextViews 设置动画:

    public void animateButtons() {
        // An array of buttons
        int[] imageButtonIds = {R.id.searchButton, R.id.favoriteButton, R.id.responseButton, R.id.articleButton, R.id.resumeButton, R.id.subscribeButton};
        // Array of textViews
        int[] textViewIds = {R.id.searchTextView, R.id.favoriteTextView, R.id.responseTextView, R.id.articleTextView, R.id.resumeTextView, R.id.subscribeTextView};
    
        int i = 1;
    
        for (int viewId : imageButtonIds) {
    
            ImageButton imageButton = (ImageButton) findViewById(viewId);
            // Animation from a file fade.xml in folder res/anim
            Animation fadeAnimation = AnimationUtils.loadAnimation(this, R.anim.fade);
            // Delay for each animation is 100 ms bigger than for previous one
            fadeAnimation.setStartOffset(i * 100);
            imageButton.startAnimation(fadeAnimation);
    
            // The same animation is for textViews
            int textViewId = textViewIds[i-1];
            TextView textView = (TextView) findViewById(textViewId);
            textView.startAnimation(fadeAnimation);
    
            i ++;
        }
    }
    

    在我的res/anim 文件夹中,我有一个名为fade.xml 的文件,其中包含以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    
    <!--  Fade animation with 500 ms duration -->
    
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
           android:interpolator="@android:anim/accelerate_decelerate_interpolator"
           android:fromAlpha="0.0" android:toAlpha="1.0"
           android:duration="500" />
    

    【讨论】:

    • 不适合我 |-) fadeAnimation.setStartOffset 更改根动画。有什么解决办法吗?
    【解决方案5】:

    创建一个动画数组并使用创建AnimationSet的方法。

        Animation[] animations = { 
                getScaleAnimation(0.4f, 1.3f, 2000), 
                getScaleAnimation(1.3f, 1.0f, 500), 
                getScaleAnimation(0.4f, 1.3f, 1000),
                getScaleAnimation(1.3f, 1.0f, 3000), 
                getScaleAnimation(0.4f, 1.3f, 500), 
                getScaleAnimation(1.3f, 1.0f, 1700), 
                getScaleAnimation(0.4f, 1.3f, 2100),
                getScaleAnimation(1.3f, 1.0f, 3400)  
        };
        AnimationSet animationSet = addAnimationAr(animations);
        view.startAnimation(animationSet);
    

    方法:

    public static AnimationSet addAnimationAr(Animation[] animations) {
        AnimationSet animationSet = new AnimationSet(false);
        long totalAnimationDuration = 0;
    
        for (int i = 0; i < animations.length; i++) {
            Animation a = animations[i];
            a.setStartOffset(totalAnimationDuration);
            totalAnimationDuration += a.getDuration();
            animationSet.addAnimation(a);
        }
    
        return animationSet;
    }
    

    【讨论】:

      【解决方案6】:

      如果你使用代码,你可以调用

      Animation.setStartOffset() 
      

      延迟第二个动画。

      如果你使用xml你可以android:ordering="sequentially"属性让两个动画顺序执行。

      【讨论】:

        【解决方案7】:

        对于简单的动画,您可以使用animate()withEndAction() 函数来实现,如下所示:

            ImageView img = findViewById(R.id.imageView);
            img.animate().rotation(180).alpha(0).setDuration(3000).withEndAction(new Runnable() {
                @Override
                public void run() {
                    ImageView img = findViewById(R.id.imageView);
                    img.animate().rotation(0).alpha(1).setDuration(2000);
                }
            });
        

        【讨论】:

        • 好主意!我尝试使用it.animate().yBy(-10F).withEndAction { it.animate().yBy(10F) } 进行“跳跃”,如果您反复点击它,它会射向月球。我想我必须硬编码y?
        【解决方案8】:

        AnimationDrawable

        在 Android 中运行这样的动画非常简单。实际上,Android API 中有一个专门用于此特定任务的类,称为AnimationDrwable。 AnimationDrawable 是一组图像在一起。

        第一步:创建 AnimationDrwable
        Step2:将动画Drawable加载到ImageView
        step3:开始动画

        第 1 步: 创建一个 XML 并像这样添加所有图像。

        <animation-list 
             xmlns:android="http://schemas.android.com/apk/res/android"
             android:oneshot="true">
             <item android:drawable="@drawable/cat_image_1" android:duration="200" />
             <item android:drawable="@drawable/cat_image_2" android:duration="200" />
             <item android:drawable="@drawable/cat_image_3" android:duration="200" />
        </animation-list>
        

        第 2 步:

        public void onCreate(Bundle savedInstanceState) {
            
            //Step 2
            ImageView myimage = (ImageView) findViewById(R.id.my_image);
            myimage.setBackgroundResource(R.drawable.rocket_thrust);
        
            //Step 3
            AnimationDrawable catAnimation = (AnimationDrawable) rocketImage.getBackground();
            catAnimation.start();
        
        }
        

        【讨论】:

          猜你喜欢
          • 2011-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-22
          相关资源
          最近更新 更多