显示具有时间延迟的图像序列

时间:2012-07-01 16:37:56

标签: android

我想一个接一个地显示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 个答案:

答案 0 :(得分:3)

您可以使用AnimationDrawable为您执行此操作,并允许您使用android:duration属性设置持续时间(以毫秒为单位)。

答案 1 :(得分:1)

AnimationDrawable可能是最好的答案,但对于另一种解决方案,您可以查看AsyncTask。

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

然后,您可以在后台暂停一段时间,然后显示下一张图像。

您可能希望事件在此任务完成时处理,并在侦听器中调用下一个事件。

答案 2 :(得分: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方面确实没有经验,但是它有效并且它可以帮我完成工作。希望它会帮助别人。