2013-12-12 3 views
1

Моя анимация кадров. Почему он отстает?живые обои, анимация кадра, лаги

Код:

public class LiveWallpaperService extends WallpaperService { 

    Bitmap mPic; 
    private final Handler mHandler = new Handler(); 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    public Engine onCreateEngine() { 
     return new CubeEngine(); 
    } 

    class CubeEngine extends Engine { 

     private float mPosY, mPosX; 

     private Matrix mMatrix = new Matrix(); 
     private int k = 1; 
     private boolean mAnime = true; 

     private boolean test; 
     private static final int NUM_RES = 30; 

     private final Runnable mDrawAnim = new Runnable() { 
      public void run() { 

       for (int i = 0; i < 31; i++) { 
        k++; 
        drawFrame(); 

        if (i == 30) { 
         k = 1; 
        } 

       } 

      } 

     }; 

     private boolean mVisible; 

     CubeEngine() { 

      Resources res = getResources(); 
      for (int i = 0; i < NUM_RES; i++) { 
       int id = res.getIdentifier("boot_00" + (100 + (i + 1)), 
         "drawable", "com.example.dxd1"); 
       mPic = BitmapFactory.decodeResource(res, id); 

      } 

     } 

     @Override 
     public void onCreate(SurfaceHolder surfaceHolder) { 

      super.onCreate(surfaceHolder); 

      setTouchEventsEnabled(false); 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      mHandler.removeCallbacks(mDrawAnim); 
     } 

     @Override 
     public void onVisibilityChanged(boolean visible) { 
      mVisible = visible; 
      if (visible) { 
      drawFrame(); 
      }else { 
       mHandler.removeCallbacks(mDrawAnim); 
      } 
     } 

     @Override 
     public void onSurfaceChanged(SurfaceHolder holder, int format, 
       int width, int height) { 
      super.onSurfaceChanged(holder, format, width, height); 

      float w = mPic.getWidth(); 
      float h = mPic.getHeight(); 
      float s = width/(float) w; 
      float s2 = height/(float) h; 

      mMatrix.reset(); 
      mMatrix.setScale(s, s2); 


     } 

     @Override 
     public void onSurfaceCreated(SurfaceHolder holder) { 
      super.onSurfaceCreated(holder); 

     } 

     @Override 
     public void onSurfaceDestroyed(SurfaceHolder holder) { 
      super.onSurfaceDestroyed(holder); 
      mVisible = false; 
      mHandler.removeCallbacks(mDrawAnim); 
     } 

     public void updateBG() { 

      if (k == 1) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00101); 

      } 
      if (k == 2) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00102); 

      } 
      if (k == 3) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00103); 

      } 
      if (k == 4) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00104); 

      } 
      if (k == 5) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00105); 

      } 
      if (k == 6) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00106); 

      } 
      if (k == 7) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00107); 

      } 
      if (k == 8) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00108); 

      } 
      if (k == 9) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00109); 

      } 
      if (k == 10) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00110); 

      } 
      if (k == 11) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00111); 

      } 
      if (k == 12) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00112); 

      } 
      if (k == 13) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00113); 

      } 
      if (k == 14) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00114); 

      } 

      if (k == 15) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00115); 

      } 
      if (k == 16) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00116); 

      } 
      if (k == 17) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00117); 

      } 
      if (k == 18) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00118); 

      } 
      if (k == 19) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00119); 

      } 
      if (k == 20) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00120); 

      } 
      if (k == 21) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00121); 

      } 
      if (k == 22) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00122); 

      } 
      if (k == 23) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00123); 

      } 
      if (k == 24) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00124); 

      } 
      if (k == 25) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00125); 

      } 
      if (k == 26) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00126); 

      } 
      if (k == 27) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00127); 

      } 
      if (k == 28) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00128); 

      } 
      if (k == 29) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00129); 

      } 
      if (k == 30) { 
       mPic = BitmapFactory.decodeResource(getResources(), 
         R.drawable.boot_00130); 

      } 

     } 

     void drawFrame() { 
      final SurfaceHolder holder = getSurfaceHolder(); 

      Canvas c = null; 

      c = holder.lockCanvas(); 
      if (c != null) { 

       drawAnim(c); 

      } 

      if (c != null) { 
       holder.unlockCanvasAndPost(c); 
      } 
      // Reschedule the next redraw 
      mHandler.removeCallbacks(mDrawAnim); 
      if (mVisible && mAnime) { 
       mHandler.postDelayed(mDrawAnim, 50); 
      } 

     } 

     void drawAnim(Canvas c) { 

      updateBG(); 

      c.drawBitmap(mPic, mMatrix, null); 

     } 

    } 
+0

Я вообще не тестировал этот код, но ваш 'updateBG()' определенно может быть исправлен; почему вы делаете все эти инструкции 'if' вместо использования' switch'/'case'? – admdrew

ответ

1

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

Я разработал приложение для клиента с полноэкранным анимированным введением с растровыми изображениями, а на большинстве устройств он не достигнет 5 кадров в секунду, в то время как (оригинальная) версия iphone достигла гораздо большего. Я прибегал к использованию только кодированного h264 фильма (который имеет другие проблемы совместимости). Таким образом, это не сработает.

Итак, главный вопрос: почему вы используете 30 растровых изображений для рисования чего-то? Не можете ли вы использовать слои, чтобы использовать меньшие растровые изображения? Может быть, анимировать их сами? Почему бы не использовать фильм вместо ручного анимирования? Вы используете полноэкранные изображения?

Если вы не используете полноэкранные изображения, возможно, выполните какое-то предварительное кэширование, так что вы уже декодировали 2 изображения в растровые изображения перед рендерингом, сохраняя при этом этот кеш обновленным.

+0

Изображение, чтобы быть гладким Мне нужна анимация из 30 растровых изображений в полноэкранном режиме. Im создает обои для планшетов, и если im использует меньшие растровые изображения, изображения будут плохого качества. Как использовать слои? – user3091874

+0

Слои - это просто растровые изображения, которые вы нарисовываете друг друга. Так что это зависит от растровых изображений. Если, например, у вас есть круг, перемещающий ваши изображения, вы можете отобразить обратное изображение и небольшое изображение круга в указанной вручную позиции. Но я боюсь, вам придется исследовать себя, как другие люди создают такие обои. Думаю, они не используют полноэкранные растровые изображения, а более динамичные сгенерированные вещи. – Peterdk

Смежные вопросы