Запуск AnimationDrawable в Android - PullRequest
9 голосов
/ 19 июля 2010

С чего мне начать AnimationDrawable, который должен анимироваться при показе активности?

Руководство разработчика рекомендует с использованием onWindowFocusChanged, но это не всегда вызывается, когда действие является частью TabHost.

Цитирую:

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

Ответы [ 4 ]

7 голосов
/ 11 августа 2012

Я знаю, что этот вопрос немного устарел, но это может быть полезно для тех, кто сталкивается с этим вопросом, как я. Один из способов запустить AnimationDrawable - создать новый Runnable и использовать метод post из ImageView.

Вы можете сделать как:

ImageView spinner = (ImageView) findViewById(R.id.my_imageView);
spinner.setBackgroundResource(R.drawable.spinner);
spinner.post(new Runnable() {
    public void run() {
        AnimationDrawable anim = (AnimationDrawable) spinner.getBackground();
        anim.start();
    }
});
6 голосов
/ 07 февраля 2011

Подход с параллельными потоками кажется наиболее популярным, но он поднимает 2 основные проблемы:

  • В соответствии с документацией весь код, связанный с пользовательским интерфейсом, должен выполняться на основном (иначе называемом) графическом интерфейсе") нить.Хотя вызов .start () для AnimationDrawable не может считаться чистой операцией пользовательского интерфейса, я все же чувствую, что он должен следовать этому правилу.
  • Вы никогда не можете точно знать, когда начнется ваша анимация.Я видел код со "магическими" значениями длины задержки, которые должны были это исправить.Вы должны знать, что Бог убивает маленького котенка каждый раз, когда программист использует такой подход.

Итак, я предлагаю использовать очень метко названный метод runOnUiThread ().Вызов его в onResume () гарантирует, что ваш код анимации будет выполняться в главном потоке, что он будет работать после присоединения окна, вы будете знать, где именно будет обрабатываться сообщение, и котятам не нужно терять ихжизни:

@Override
protected void onResume()
{
    super.onResume();
    runOnUiThread(new Runnable() 
    {
        @Override
        public void run() 
        {
            animation.start();
        }
    });
}
0 голосов
/ 03 марта 2014

В соответствии с документацией, вы должны подождать, пока вид будет прикреплен к окну, прежде чем начинать анимацию.Для этого вы должны добавить OnAttachStateChangeListener к представлению, которое будет выполняться после его присоединения, и запустить анимацию оттуда.

ImageView loadingImg = (ImageView)v.findViewById(R.id.image);
loadingImg.setBackgroundResource(R.drawable.progressdialog);
loadingImg.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
  @Override
  public void onViewAttachedToWindow(View v) {
    AnimationDrawable loadingAnimation = (AnimationDrawable) v.getBackground();
    loadingAnimation.start();
  }

  @Override
  public void onViewDetachedFromWindow(View v) {
  }
});
0 голосов
/ 19 июля 2010

Активность onResume() всегда вызывается, когда активность выходит на передний план. Попробуйте начать там.

...