Кадровая анимация не работает

1

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

EDIT: после многих дней проб и ошибок я запустил APK на своем телефоне вместо эмулятора. Он работает на моем телефоне, но по какой-то причине он не находится на эмуляторе.

Теги:
animation

3 ответа

4
Лучший ответ

Я не совсем понимаю, почему вы не можете запускать анимации из потока 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>
  • 0
    Используя этот код, я получаю ошибки: Строка 14: тип new Runnable () {} должен реализовывать унаследованный абстрактный метод Runnable.run (). Строка 16: синтаксическая ошибка при запуске токена, ожидается идентификатор после этого токена.
  • 0
    @Miles O'Keefe извините за это, исправлено.
Показать ещё 2 комментария
0

Хотите добавить комментарий к 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();
}
0

Я тоже с этим боролся. Это объясняется в учебнике анимации фреймворка андроида, но пусть говорят с "маленькими буквами". Позвольте мне скопировать ответ оттуда:

Важно отметить, что метод start(), вызываемый в AnimationDrawable, не может быть вызван во время метода onCreate() вашей Activity, потому что AnimationDrawable еще не полностью привязан к окну. Если вы хотите немедленно воспроизвести анимацию, не требуя взаимодействия, вы можете вызвать ее из метода onWindowFocusChanged() в своей Activity, который вызывается, когда Android переключит ваше окно в фокус.

Это находится в самом низу http://developer.android.com/guide/topics/graphics/view-animation.html#frame-animation

  • 0
    Я последовал этому совету, но изображение осталось прежним. Я добавил: TextView top = (TextView) findViewById (R.id.top); top.setText ( "Начало"); После frameAnimation.start (); чтобы проверить, что слушатель действительно срабатывает. Текст был изменен на «запущен», но изображение не изменилось.
  • 0
    Насколько я вижу, это должно работать. Можете ли вы также установить анимацию для рисования в onWindowFocusChanged (), а не в OnCreate? Это не должно иметь никакого значения, но, возможно, ... И скопируйте ваш код еще раз, если он все еще не работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню