2015-03-05 2 views
0

У меня есть 4 TextViews. Они все начинают невидимым, и я оживляю их на экране (скольжение снизу). Я запускаю нить для анимации каждого из них, начиная 200 миллисекунд друг за другом. Проблема заключается в следующем: ПЕРВЫЙ момент, когда я аниматирую TextViews после запуска активности, они отстают. Но если я потом снова их оживу, они этого не сделают. А изредка они будут случайным образом отставать, но это не очень часто. Мне просто интересно, есть ли способ предотвратить это. Я тестировал только на одном телефоне, так что это может быть так, но это странно, что это происходит только в первой анимации после запуска этой операции.Анимация (изредка) laggy

animatingGroup = 0; 
    final Handler handler = new Handler(); 
    Runnable runnable = new Runnable() { 
     public void run() { 
      while (animate) { 

       try { 
        Thread.sleep(200); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       handler.post(new Runnable() { 
        public void run() { 
         Animation slideInAnim = AnimationUtils 
           .loadAnimation(getApplicationContext(), 
             R.anim.slide_in_from_bottom); 
         switch (animatingGroup) { 
         case 1: 
          tv1.startAnimation(slideInAnim); 
          tv1.setVisibility(View.VISIBLE); 
          break; 
         case 2: 
          tv2.startAnimation(slideInAnim); 
          tv2.setVisibility(View.VISIBLE); 
          break; 
         case 3: 
          tv3.startAnimation(slideInAnim); 
          tv3.setVisibility(View.VISIBLE); 
          break; 
         case 4: 
          tv4.startAnimation(slideInAnim); 
          tv4.setVisibility(View.VISIBLE); 
          animate = false; 
          break; 
         } 
         animatingGroup++; 
        } 
       }); 
      } 

     } 
    }; 
    new Thread(runnable).start(); 

и вот анимация:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" > 

    <translate 
     android:duration="800" 
     android:toYDelta="0%" 
     android:fromYDelta="100%p" /> 

</set> 
+0

Использовать handler.postdelayed() вместо thread.sleep и где находится этот код? также удалите свою нить и используйте runnable вместо этого. –

ответ

1

Dont создать slideInAnim Insider обработчик, он будет съедать ресурсы, как ад, попробуйте создать его один раз ... в OnCreate(), возможно

EDIT: Это на мой взгляд, чистый и простой способ сделать то, что вы хотите достичь:

Поместите свой TextViews в массиве:

TextView[] textViews = new TextView[]{tv1,tv2,tv3,tv4}; 

Сделать цикл, который обрабатывает анимацию startOffset:

int startOffset = 200; 

for(int i=0; i < textViews.length(); i++){ 
    animSlideIn.setStartOffset(startOffset); 
    textViews[i].setVisibility(View.Visible); 
    textViews[i].startAnimation(animSlideIn); 
    startOffset = startOffset + 200; 
} 

Таким образом, вы можете вырезать новую тему и Handler Runnable материал, и сэкономить много кода.

+0

Я также думаю, что цикл while уродлив и может быть ответственным за задержку, возможно, вы захотите переоценить весь дизайн. Попробуйте избавиться от цикла while и новой темы и используйте AnimationListener для запуска, остановки и очистки анимаций вместо этого. –

+0

Ну, цель цикла while - запустить каждую анимацию 200 миллисекунд друг за другом. Удаление из него приведет к тому, что они будут анимированы одновременно, поэтому мне нужно что-то сохранить эту функциональность. – user1282637

+0

Вы можете, например, установить startOffset 200 мс в вашей анимации. Таким образом, он будет ждать 200 мс, а затем запустится –