ボタンが押されたときのonClickハンドラで、何回もImageView#setImageResourceを呼び出しても、画像は更新されなかった。調べてみたら、onClickのハンドラが抜けてUIスレッドに制御が渡らないと描画されないらしい。それで、結局次のようにして解決した。まず、Runnableを実装するImageControlクラスを作成する。


public class ImageControl implements Runnable{
private ImageView iv;
private int num = 0;
ImageControl(ImageView v){ iv = v; }

@Override
public void run() {
iv.setImageResource(image[num]);

if (num >= 48){
num = 0;
}else{
num++;
iv.postDelayed(this, 10);
}
}
}

上記で、image配列はあらかじめ用意されているリソース。numが0-48の間は、postDelayedを呼び出すことで、再度runメソッドが呼ばれるようにする。

そして、onClickハンドラには次の記述を追加する。


imageView.postDelayed(new ImageControl(imageView), 10);

つまり、メソッドは次のように繰り返して呼び出される。
onClick->imageView#postDelayed->imageControl#run->imageView#postDelayed->imageControl#run->..

画像を切替える必要がある間は、runメソッドの中で再度postDelayedを呼び出してやる。そうすればまたrunメソッドが呼ばれる、という仕組み。そしてrunメソッドの中ではsetImageResourceを呼び出すことで、1枚だけ画像を切り替える。

これで、ボタンをクリックすると映像が連続して切り替わる動作が実装できた。

Comments