別の操作中に、ビットマップのピクセルを 1 秒ごとに操作し、結果を に表示する必要がありImageView
ます。これは、ビットマップと更新を操作するメソッドですImageView
。
private void overlay(Bitmap bitmap) {
int j = 70;
while (flag) {
//here I manipulate some pixels of bitmap that corresponds to "j"
//and save result in "tempBmp":
...
//update imageView:
iv1.setImageBitmap(tempBmp);
iv1.postInvalidate();
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// }
//update "j":
j = (j+1)%src.rows();
}
}
上記のメソッドは、UI スレッド (onclick
ボタンのイベント) から次のように呼び出されます。
runOnUiThread(new Runnable() {
public void run() {
overlay(bmp);
}
});
アプリの実行中は、アプリのクラッシュや ANR は問題ありませんが、ImageView
( iv1
) は更新されません。コードをデバッグすると、ビットマップのピクセルが操作されています。try/catch
また、ブロックのコメントを外しましたが、結果は同じでした。
奇妙です: while ブロックの開始と終了にコメントを付けると、ビットマップが正しく操作され (1 回と 1 回j = 70
)、ImageView
期待どおりに更新されます!
更新の質問:
eshayne と Onik のコメントと回答に対して、ピクセル操作のoverlay
方法を単純な操作に変更して結果を確認しましたが、結果は同じでした。実際のoverlay
方法を使用しますopenCV
が、ここではピクセルの色を変更するため、使用せずに結果を確認できますopenCV
:
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new Thread(new Runnable() {
@Override
public void run() {
overlay(bmp);
}
}).run();
}
});
オーバーレイ メソッド、簡略化:
private void overlay(Bitmap bitmap){
int j = 0;
tempBmp = Bitmap.createBitmap(bitmap);
while (j < bitmap.getHeight()) {
for (int i = 0; i < bitmap.getWidth(); i++) {
tempBmp.setPixel(i, j, 0);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// post the changes to Ui thread
iv1.post(new Runnable() {
@Override
public void run() {
iv1.setImageBitmap(tempBmp);
}
});
j = (j + 1);
}
}
ImageView
を毎秒更新するにはどうすればよいwhile
ですか? 私は何か間違ったことをしましたか?