Как запустить анимацию сразу после создания? - PullRequest
14 голосов
/ 03 сентября 2011

Я следую http://developer.android.com/guide/topics/graphics/view-animation.html#frame-animation с небольшими изменениями. Я решил сделать цикл анимации и хочу, чтобы он начинался с самого начала.

Моя анимация находится в drawable / listen.xml:

<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
    android:drawable="@drawable/l_01"
    android:duration="200" />
<item
    android:drawable="@drawable/l_02"
    android:duration="200" />
<item
    android:drawable="@drawable/l_03"
    android:duration="200" />
</animation-list>

и мой код инициализации:

 @Override public void onWindowFocusChanged(boolean hasFocus)  { 
      super.onWindowFocusChanged(hasFocus); 
      animImg = (ImageView)findViewById(R.id.listen_anim);
      animImg.setBackgroundResource(R.drawable.listening);
      anim = (AnimationDrawable) animImg.getBackground(); 
      anim.start();
 };

Все, что я вижу, - это первый кадр и никаких других изображений.

Ответы [ 6 ]

46 голосов
/ 03 сентября 2011

Это уже написано в уроке:

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

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

Так что переведите ваш звонок, чтобы начать в одном из этих двух мест, в зависимости от вашего желания. Исходя из вашего комментария, переместите ваш вызов для начала внутри onWindowsFocusChanged () .

EDIT Так что это «Как это сделать» :

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    if(hasFocus){
        textView.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,
            android.R.anim.slide_in_left|android.R.anim.fade_in));
    }   
}

На что следует обратить внимание:

  • не забудьте написать регистр if / else, чтобы проверить фокус
  • и удалите автоматически сгенерированный "super.onWindowFocusChanged (hasFocus); "
9 голосов
/ 03 сентября 2011

Установите флаг в onAttachedToWindow(), а затем в onWindowFocusChanged() проверьте его и запустите анимацию.

@Override
void onWindowFocusChanged(boolean hasFocus) {
    if (hasFocus & mbFlag) {
        // start animation.
    }
}

Обновите

Просто расширьте класс ImageView и переопределите onFocusChange метод.Затем в своей деятельности сфокусируйтесь на этом, позвонив animImg.requestFocus().Анимация должна начаться, когда она сфокусируется.Убедитесь, что ваш просмотр изображения является фокусируемым.

Если это не работает, вы также можете переопределить метод onAttachedToWindow().Установите флаг и проверьте перед запуском анимации.

@Override
void onFocusChange(boolean hasFocus) {
    if (hasFocus) {
        // start animation.
    }
}
4 голосов
/ 10 февраля 2013

Вы можете использовать метод post любого View в упражнении.Вероятно, это должно выглядеть так:

View anyView = findViewById(R.id.anyView);
anyView.post(new Runnable()
{
    @Override
    public void run()
    {
        // Your code goes here
    }
});
0 голосов
/ 30 июля 2013
animation = AnimationUtils.loadAnimation(this, R.anim.push_left_out);

yourobject.startanimation(animation);

Это может помочь

0 голосов
/ 03 сентября 2011

Вам нужно дать время менеджеру UI создать соответствующие ресурсы ДО начала анимации. Правильный шаблон

a) Create animation object in onCreate.
b) Start animation object elsewhere.

Не создавайте и не запускайте одним и тем же способом.

0 голосов
/ 03 сентября 2011

Запустите это в onResume ():

class AnimTask extends AsyncTask<String, String,String> {
            Activity act;
            AnimTask(Activity act) {
                this.act = act;
            }

            @Override
            protected String doInBackground(String... params) {
                act.runOnUiThread(new Runnable() {
                    public void run(){
                        animImg = (ImageView)findViewById(R.id.listen_anim);
                        animImg.setBackgroundResource(R.drawable.listening);
                        anim = (AnimationDrawable) animImg.getBackground();
                        anim.start();
                    }
                });
                return null;
            }
        }
...