2012-07-01 3 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, который делает это за вас, и позволяет установить длительность (в миллисекундах) с использованием андроида: атрибут продолжительности.

+0

+1 - Хорошее, простое решение. :) –

+0

анимация вытягивается совсем не используется в android. они всегда заканчиваются памятью –

1

The 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, но это работает, и это делает работу для меня. Надеюсь, это поможет кому-то.

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