2014-07-14 30 views
2

由於AnimationDrawable的內存在幾張圖片後爆炸,我需要自己寫。谷歌有一些關於高效框架動畫的演示,但它非常複雜(不必要?)。試圖爲Android創建一個高效的無限循環框架動畫例程

這是我最初的方法,我可以得到一些專家/智能體育俱樂部鈴聲?

  1. 在UI線程上創建一個處理程序。
  2. 爲處理程序創建可運行程序(A)。
  3. 在可運行程序(A)內部,我爲每個框架創建了AsyncTasks。
  4. 每個AsyncTask都使用PostDelay運行以獲得所需的幀速率。
  5. 目標ImageVew設置Wync從AsyncTask的新幀。

下面是代碼:

private void addTask(Handler handler, final String animationName, final int frameNumber, final AsyncTaskLoadBitmap asyncLoadBitmap, int frameIndex) { 
    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      int frameIdentifier = getResources().getIdentifier(animationName, "drawable", getPackageName()); 
      Log.v("Runable","adding name"); 
      new AsyncTaskLoadBitmap(imageView,thisActivity).execute(frameIdentifier); 
     } 
    }; 

    boolean done = handler.postDelayed(runnable,100 + (100 * frameIndex)); 
    Log.v("PostDelayed","Done"); 
} 

我在被進行循環和方式來停止循環的問題。

什麼可能是更好的方法?

回答

1

試試這個:

final ImageView iv = new ImageView(this); 
    setContentView(iv); 

    final int LOAD = 1; 
    final int SHOW = 2; 
    HandlerThread loader = new HandlerThread("frameLoader"); 
    loader.start(); 
    Callback callback = new Callback() { 
     int idx = 0; 
     int[] ids = { 
       R.drawable.ic_launcher, R.drawable.layer0, R.drawable.layer1, 
     }; 
     Resources res = getResources(); 
     @Override 
     public boolean handleMessage(Message msg) { 
      if (msg.what == LOAD) { 
       Log.d(TAG, "handleMessage LOAD " + Thread.currentThread().getName()); 
       idx++; 
       if (idx < 18) { 
        Bitmap btm = BitmapFactory.decodeResource(res, ids[idx % ids.length]); 
        msg = mUIHandler.obtainMessage(SHOW, btm); 
        mUIHandler.sendMessage(msg); 
       } 
      } else 
      if (msg.what == SHOW) { 
       Log.d(TAG, "handleMessage SHOW " + Thread.currentThread().getName()); 
       iv.setImageBitmap((Bitmap) msg.obj); 
       mBackgroundHandler.sendEmptyMessageDelayed(LOAD, 500); 
      } 
      return true; 
     } 
    }; 
    mBackgroundHandler = new Handler(loader.getLooper(), callback); 
    mUIHandler = new Handler(callback); 

    mBackgroundHandler.sendEmptyMessage(LOAD);