2012-07-01 36 views
0

我希望一個接一個地顯示9個圖像。我已經包括了9個圖像作爲數組:以時間延遲顯示圖像序列

imageHolders = new ArrayList<ImageView>(); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgOne)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgTwo)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgThree)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgFour)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgFive)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgSix)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgSeven)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgEight)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgNine)); 

這是我曾嘗試:

public void handleMessage(Message msg) { 
     int currentImage = 0; 
     int nextImage = 0; 
     // Logic to change the images 
     for (final ImageView imageView : imageHolders) { 
      currentImage = Integer.parseInt(imageView.getTag().toString()); 
      if (currentImage > 1) { 
       nextImage = currentImage - 1; 
      } else { 
       nextImage = 9; 
      } 
        imageView.setTag(""+nextImage); 

      new CountDownTimer(10000, 1000) { 

       public void onTick(long millisUntilFinished) { 

       } 

       public void onFinish() { 
         imageView.setVisibility(VISIBLE); 
       } 
       }.start();   

     } 
     super.handleMessage(msg); 
    } 

} 

有所述第一和第二圖像之間的延遲。我無法在其餘時間之間引入延遲。我對推遲延遲毫無頭緒。任何建議,將不勝感激。

+3

爲什麼不只是使用AnimationDrawable它爲你做這個http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html? –

+1

@MonaCheikhna:我想你可以發表評論作爲答案。 – Squonk

回答

3

您可以使用AnimationDrawable,它可以幫助您,並允許您使用android:duration屬性設置持續時間(以毫秒爲單位)。

+0

+1 - 很好,簡單的解決方案。 :) –

+0

動畫drawable在android中並不是很有用。它們總是以失去內存而結束 –

1

AnimationDrawable可能是最好的答案,但對於另一種解決方案,您可以查看AsyncTask。

http://developer.android.com/reference/android/os/AsyncTask.html

然後,您可以在後臺剛從睡眠狀態的時間一定金額時,則顯示下一個圖像。

雖然在完成此任務時您可能需要處理一個事件,但在您調用下一個任務的偵聽器中可能需要處理該事件。

1

如果您只想製作一個簡單的靜態動畫(所有圖像位於同一位置),您可以使用AnimationDrawable,但不能動態地對其進行動態更改 - 如更改速度或其他內容。 我剛剛寫了一個簡單的類,因此我可以爲一個ImageView設置多個動畫並更改速度。

public class ImageSequence extends ImageView { 

ArrayList<Drawable> draws = new ArrayList<Drawable>(); 
ArrayList<Integer> bnds = new ArrayList<Integer>(); //bounds of sequences - index of first and last frame. 
ArrayList<String> names = new ArrayList<String>(); //sequences names. 
Timer timer = new Timer(true); 
TimerTask task; 
int p = -1; //current playback position. 
int cS = -1; //current sequence. 


public ImageSequence(Context context) { 
    super(context); 
    createTask(); 
} 

public void addSequence(String name, int[] res){ 
    names.add(name); 
    bnds.add(draws.size()); 
    bnds.add(draws.size() + res.length - 1); 
    for (int i = 0; i < res.length; i++){ 
     draws.add(getContext().getResources().getDrawable(res[i])); 
    } 
} 

public void play(String sequence, float speed){  
    cS = -1; 
    for(int i = 0; i < names.size(); i++){ 
     if(names.get(i) == sequence){ cS = i; break;} 
    } 
    if(cS<0) return; 
    p = -1; 
    task.run(); 
    task.cancel(); 
    if(speed <= 0) return; 
    createTask(); 
    timer.schedule(task, (long) (1000/speed), (long) (1000/speed)); 
} 

public void stop(){ 
    task.cancel(); 
} 

public void cancelTimer(){ 
    timer.cancel(); 
} 

private void createTask() { 
    task = new TimerTask(){ 
     public void run() { 
      p++; 
      mHandler.obtainMessage(1).sendToTarget(); 
     } 
    }; 
} 

public Handler mHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     int l = p; 
     if(l > bnds.get(cS*2+1) || l < bnds.get(cS*2)) l = bnds.get(cS*2); 
     p = l; 
     ImageSequence.this.setImageDrawable(draws.get(l)); 
    } 
}; 
} 

從外面就可以使用這樣的:

seq.addSequence("orange", new int[]{R.drawable.ic_oval_diode_orange, R.drawable.ic_oval_diode_off}); 
seq.addSequence("green", new int[]{R.drawable.ic_oval_diode_green, R.drawable.ic_oval_diode_off}); 
seq.addSequence("red", new int[]{R.drawable.ic_oval_diode_red, R.drawable.ic_oval_diode_off}); 
seq.play("red", 4); 

我不是真的經歷過的Android和Java,但它的工作原理,它爲我做的工作。希望它能幫助別人。