Подтвердить что ты не робот

AnimationDrawable не играет

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

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

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();

        }



}

Спасибо

4b9b3361

Ответ 1

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

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 не всегда будет работать. Это кажется более простым и, вероятно, лучшей идеей, если он работает для вас.

Ответ 2

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

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

Ответ 4

Мое решение для воспроизведения анимаций, пока они видны. Это позволяет вам объявить (в 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();
    }
}

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

Ответ 5

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

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

Ответ 6

Я исправил эту проблему вызовом 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();
    }
 });

Примечание: до reset использование анимации

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