Я пробовал каждый образец кода, который я могу найти, который определяет и запускает анимацию кадра, но ImageView никогда не изменяется. Исходное изображение в ImageView остается.
EDIT: после многих дней проб и ошибок я запустил APK на своем телефоне вместо эмулятора. Он работает на моем телефоне, но по какой-то причине он не находится на эмуляторе.
Я не совсем понимаю, почему вы не можете запускать анимации из потока onCreate, они должны быть отправлены в любой поток, обработчик которого был создан.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView view = (ImageView) findViewById(R.id.shell);
view.setVisibility(ImageView.VISIBLE);
view.setBackgroundResource(R.drawable.animation_frame);
view.post(new Runnable(){
public void run(){
AnimationDrawable frameAnimation = (AnimationDrawable) view.getBackground();
frameAnimation.start();
}
});
}
}
Я понятия не имею, зачем вам это нужно, но вы это делаете.
edit: Вот отрывки из моего рабочего проекта должны быть все, что вам нужно...
в java в onCreate:
final ImageView image1 = (ImageView) v.findViewById(R.id.coin1);
image1.post(new Runnable() {
@Override
public void run() {
AnimationDrawable ani = (AnimationDrawable) image1.getBackground();
ani.start();
}
});
в макете xml:
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/coin"
android:id="@+id/coin1"/>
монета xml:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/coin_spin_a" android:duration="100"/>
<item android:drawable="@drawable/coin_spin_b" android:duration="100"/>
<item android:drawable="@drawable/coin_spin_c" android:duration="100"/>
<item android:drawable="@drawable/coin_spin_d" android:duration="100"/>
<item android:drawable="@drawable/coin_spin_e" android:duration="100"/>
<item android:drawable="@drawable/coin_spin_f" android:duration="100"/>
</animation-list>
Хотите добавить комментарий к schwiz answer.
Мне удалось заставить его работать от вызова Handler.post из рабочего потока. Ниже приведен образец.
public void onCreate(Bundle savedInstanceState) {
Thread t;
final ImageView activityIndicator;
final AnimationDrawable animiDrawable;
LinearLayout contentPlaceholder;
contentPlaceholder = (LinearLayout)this.findViewById(R.id.content_placeholder);
activityIndicator = new ImageView(this);
contentPlaceholder.addView(activityIndicator);
activityIndicator.setBackgroundResource(R.drawable.ic_activity_indicator_bar);
animiDrawable = (AnimationDrawable)activityIndicator.getBackground();
t = new Thread(new Runnable() {
@Override
public void run() {
mCbt.mThreadHandler.post(new Runnable() {
@Override
public void run() {
animiDrawable.start();
}
});
};
});
t.start();
}
Я тоже с этим боролся. Это объясняется в учебнике анимации фреймворка андроида, но пусть говорят с "маленькими буквами". Позвольте мне скопировать ответ оттуда:
Важно отметить, что метод start(), вызываемый в AnimationDrawable, не может быть вызван во время метода onCreate() вашей Activity, потому что AnimationDrawable еще не полностью привязан к окну. Если вы хотите немедленно воспроизвести анимацию, не требуя взаимодействия, вы можете вызвать ее из метода onWindowFocusChanged() в своей Activity, который вызывается, когда Android переключит ваше окно в фокус.
Это находится в самом низу http://developer.android.com/guide/topics/graphics/view-animation.html#frame-animation