다른 작업 중에 비트 맵의 픽셀을 1 초마다 조작하고 결과를 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);
}
});
이, 아니이이 비트 맵 업데이트 ImageView
를 조작하는 방법입니다 문제, 앱 충돌 또는 ANR이 있지만 ImageView
(iv1
)은 업데이트되지 않습니다. 코드를 디버그하고 비트 맵의 픽셀이 조작 중입니다. 또한 try/catch
블록의 주석 처리를 제거했지만 결과는 같습니다.
이상한 점이 있습니다. while 블록의 시작과 끝 부분에 주석을 달면 비트 맵이 올바르게 조작됩니다 (한 번만 j = 70
). ImageView
업데이트가 예상대로 작동합니다!
업데이트 질문 : 의견과 eshayne 및 Onik I의 답변과 관련하여
는 간단한 조작으로 overlay
방법으로 픽셀 조작을 변경하고 결과를 확인하지만 결과는 동일했다. 실제 overlay
방법을 사용 openCV
그러나 여기 당신이 openCV
를 사용하지 않고 결과를 볼 수 있도록 내가 픽셀의 색상을 변경 : 어떻게 ImageView
, 모든를 업데이트 할 수 있습니다
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);
}
}
을 :
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new Thread(new Runnable() {
@Override
public void run() {
overlay(bmp);
}
}).run();
}
});
오버레이 방법을 단순화, 초는 while
? 나는 어떤 일을 잘못 했습니까?
메인 스레드는 볼 수 없지만 기본 스레드 – Blackbelt
@blackbelt는 괜찮습니까?하지만 imageview가 업데이트되지 않는 이유는 무엇입니까? – hasanghaforian
비트 맵을 어디에서 수정하는지 어느 곳에서도 볼 수 없습니다 – Blackbelt