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();
}
}
Спасибо
Ответы
Ответ 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
Я запускаю анимацию.
Ответ 3
Попробуйте запустить анимацию после того, как окно станет фокусом, переопределив onWindowFocusChanged в вашей деятельности:
@Override
public void onWindowFocusChanged (boolean hasFocus)
{
//Start animation here
}
Смотрите документы здесь: http://developer.android.com/reference/android/app/Activity.html#onWindowFocusChanged%28boolean%29
Ответ 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();