1

다른 작업 중에 비트 맵의 ​​픽셀을 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? 나는 어떤 일을 잘못 했습니까?

+1

메인 스레드는 볼 수 없지만 기본 스레드 – Blackbelt

+0

@blackbelt는 괜찮습니까?하지만 imageview가 업데이트되지 않는 이유는 무엇입니까? – hasanghaforian

+0

비트 맵을 어디에서 수정하는지 어느 곳에서도 볼 수 없습니다 – Blackbelt

답변

0

루프를 UI 스레드 외부로 이동 한 다음 UI 스레드 내에서 setImageBitmap 호출을 실행하십시오. 다음과 같이 :

// from non-UI thread: 
while (flag) { 
    // perform image manipulation 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      iv1.setImageBitmap(tempBmp); 
     } 
    }); 
} 
+0

불행히도, 작동하지 않습니다! – hasanghaforian