AnimationDrawable не играет - PullRequest
21 голосов
/ 30 марта 2011

Поэтому я хочу, чтобы моя анимация запускалась сразу после создания действия, но по какой-то причине, независимо от того, что я пытаюсь, она запустится. Я могу заставить его начать с события click, но я хочу, чтобы он запускался сам по себе.

Вот что у меня есть и как заставить это работать?

package tween.learn;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.widget.ImageView;

public class Animate extends Activity {

    public ImageView image;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        ImageView tweenImage = (ImageView) findViewById(R.id.imageView1);
        tweenImage.setBackgroundResource(R.anim.cubicfacetween);

        AnimationDrawable frameAnimation = 
                           (AnimationDrawable) tweenImage.getBackground();
        frameAnimation.start();

        }



}

Спасибо

Ответы [ 6 ]

61 голосов
/ 30 марта 2011

Я думаю, что вы должны запустить анимацию после завершения инициализации рассматриваемого представления.Вы должны быть в состоянии сделать что-то вроде:

final ImageView tweenImage = (ImageView) findViewById(R.id.imageView1);
tweenImage.setBackgroundResource(R.anim.cubicfacetween);      
tweenImage.post(new Runnable() {
    @Override
    public void run() {
        AnimationDrawable frameAnimation =
            (AnimationDrawable) tweenImage.getBackground();
        frameAnimation.start();
    }
}

Редактировать - этот вопрос заставил меня поверить, что метод onWindowFocusChanged не всегда будет работать.Это кажется более простым и, вероятно, лучше, если это работает для вас.

21 голосов
/ 23 июля 2012

Я знаю, что это старый вопрос, но у меня была та же проблема, но ответы не помогли мне.Потратив на это много часов работы, я, наконец, обнаружил, что моя проблема в том, что я добавил android:src="@drawable/myanimation" в контейнер просмотра изображений.Как только я удалил это, вышеприведенные ответы сработали.Я думаю, что анимация работала, но установив src, первое изображение анимации было поверх него, и поэтому я подумал, что оно не воспроизводится.

  • В моем конечном коде есть файл XML санимация, сохраненная в папке для рисования
  • Мой макет имеет вид изображения без определения android:src и установлен как невидимый
  • В onCreate я установил вид изображения на видимый, а setBackgroundResource -моя анимация описана в файле XML
  • в onWindowFocusChanged Я запускаю анимацию.
3 голосов
/ 27 апреля 2012

Мое решение для воспроизведения анимаций, пока они видны. Это позволяет вам объявить (в формате XML) и забыть.

class AnimatedImageView extends ImageView {
    // required constructors omitted for clarity 

    private void updateAnimationsState() {
        boolean running = getVisibility() == View.VISIBLE && hasWindowFocus();
        updateAnimationState(getDrawable(), running);
        updateAnimationState(getBackground(), running);
    }

    private void updateAnimationState(Drawable drawable, boolean running) {
        if(drawable instanceof AnimationDrawable) {
            AnimationDrawable animationDrawable = (AnimationDrawable) drawable;
            if(running) {
                animationDrawable.start();
            } else {
                animationDrawable.stop();
            }
        }
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        updateAnimationsState();
    }

    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
        updateAnimationsState();
    }
}

Если вы настраиваете drawable из кода, то вы должны переопределить соответствующие методы set * () и вызвать там updateAnimationsState ().

3 голосов
/ 30 марта 2011

Попробуйте запустить анимацию после того, как окно получит фокус, переопределив onWindowFocusChanged в вашем действии:

  @Override
  public void onWindowFocusChanged (boolean hasFocus)
  {
      //Start animation here
  }

См. Документы здесь: http://developer.android.com/reference/android/app/Activity.html#onWindowFocusChanged%28boolean%29

2 голосов
/ 09 апреля 2015

Еще одно решение:

Вызовите animationDrawable.stop() перед вызовом start() метода.

0 голосов
/ 12 апреля 2016

Я исправил эту проблему с помощью вызова setBackgroundResource вместо setImageResource, когда я хочу запустить анимацию, как указано в ответах выше

private AnimationDrawable animationDrawable;


 fab.setImageResource(R.drawable.animation);
 animationDrawable = (AnimationDrawable) fab.getDrawable();
 fab.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {
        fab.setBackgroundResource(R.drawable.animation);
        animationDrawable.start();
    }
 });

примечание: для сброса анимации используйте

animationDrawable.selectDrawable(0);//animation drawable used here is collection of images
animationDrawable.stop();
...