在另一個操作過程中,我必須每秒處理一次位圖的像素,並在ImageView
中顯示結果。這是操縱位圖和更新ImageView
的方法:使用UI線程更新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
區塊的註釋,但結果是一樣的。
奇怪的是:當我評論塊的開始和結束時,位圖操作正確(一次,對於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
?我做錯了什麼?
我看不到任何線程,但主線程 – Blackbelt 2014-10-03 18:57:15
@blackbelt行!但爲什麼imageview不更新? – hasanghaforian 2014-10-03 18:58:50
我看不到你在修改位圖的位置 – Blackbelt 2014-10-03 19:01:25