2013-02-04 67 views
0

我想作一個動畫,我有一個球的10張圖像,我想做的事:動畫,延緩

  1. Image1可見,所有其他圖像隱藏
  2. Image2可見的所有其他圖像隱藏
  3. ...
  4. Image10可見的所有其他圖像隱藏

應我在一個動畫(如何?)中做到這一點,或者我應該創建一個java方法showImage(String pathimage),它將顯示位於pathimage的圖像並隱藏其他圖像?我可以把時間延遲的任何想法用

handler.postDelayed(new Runnable() { 
    public void run() { } 
} 

編輯,這裏是我的代碼 的問題是,運行()總是在什麼似乎是一個無限循環調用。但我看不出哪裏是我的錯誤

GAMEACTIVITY

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
..... 
     ImageView image2 = (ImageView) findViewById(R.id.imageView3); 
     image2.setOnTouchListener(new OnTouchListener(){ 

      @Override 
      public boolean onTouch(View arg0, MotionEvent arg1) { 
       myAsyncRunnable mar = new myAsyncRunnable(GameActivity.this); 
       mar.execute(null); 
       PhotoTask photoTask = new PhotoTask(camera,surfaceCamera,isPreview,holder,GameActivity.this); 
       photoTask.execute(null); 
       Log.w("GAMEACTIVITY","PHOTOTASK"); 
       return false; 
      } 

     }); 
} 

我的異步任務

public class myAsyncRunnable extends AsyncTask<Void, Boolean, Void> { 

    GameActivity gameactivity; 

    @Override 
    protected Void doInBackground(Void... params) { 
     pull(); 
     return null; 
    } 

public myAsyncRunnable(GameActivity gameactivity) { 
    super(); 
    this.gameactivity = gameactivity; 
} 


    public void pull() { 

     final ImageView image3 = (ImageView) gameactivity.findViewById(R.id.imageView3); 
     final int drawables[] = new int[] {R.drawable.pull2,R.drawable.pull3,R.drawable.pull4,R.drawable.pull5,R.drawable.pull6,R.drawable.pull7}; 
     Runnable runnable = new Runnable() { 

      @Override 
      public void run() { 
       for (int i=0;i<drawables.length;i++) { 
        image3.setImageResource(drawables[i]); 
        gameactivity.handler.postDelayed(this, 500); 
        Log.w("asyncrunnable","run"+i); 
       } 

      } 

     }; 
     gameactivity.handler.post(runnable); 
    } 
} 

回答

1

你不應該創建10個ImageViews做這樣的動畫。

只有一個ImageView應該足夠了!每x毫秒左右使用一個處理程序來更新圖像,使用任何味道setImage

的整數初始化數組中的圖像和當前圖像:

int drawables[] = new int[] {R.drawable.image1, R.drawable.image2, ...}; 
int mCurrent = 0; 

然後初始化更新:

Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
       if(mCurrent>=drawables.length)mCurrent=0; 
       imageView.setImageResource(drawables[mCurrent]); 
       mHandler.postDelayed(this, 3000); //every 3 seconds 
    } 
}; 

最後,當你想創業,只是後可運行:

mHandler.post(runnable); 

你的代碼是錯誤的:

試試這個拉動作用(雖然我真的不批准整個代碼風格,但沒有時間去修復)

public void pull() { 

    final ImageView image3 = (ImageView) gameactivity.findViewById(R.id.imageView3); 
    final int drawables[] = new int[] {R.drawable.pull2,R.drawable.pull3,R.drawable.pull4,R.drawable.pull5,R.drawable.pull6,R.drawable.pull7}; 
      for (int i=0;i<drawables.length;i++) { 
       final int j = i; 
    Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
       image3.setImageResource(drawables[j]); 

     } 

    }; 
       gameactivity.handler.postDelayed(this, 500 * i); 
       Log.w("asyncrunnable","run"+i); 
      } 
} 

}

+0

那你知道我是怎麼可能會做一個循環? 因爲\t \t image3.setImageResource(R.drawable.pathimagei)當然不起作用,因爲pathimagei不是可繪製的,但它指的字符串是.. – morg

+0

好的,謝謝,現在我有一個問題,因爲我認爲這太慢了在主UI線程中執行。我有可運行的擴展AsyncTask嗎? – morg

+0

太慢?這是最低限度的工作。你只是設置圖像。如果你想使用asynctask,你可能會在後臺加載位圖,然後將其設置在onPostExecute中。但是因爲你的圖片在res /那麼你不會獲得那麼多(它應該已經很快) –