1

在另一個操作過程中,我必須每秒處理一次位圖的像素,並在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,但ImageViewiv1)不會更新。我調試代碼和位圖的像素正在操作。我也取消了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?我做錯了什麼?

+1

我看不到任何線程,但主線程 – Blackbelt 2014-10-03 18:57:15

+0

@blackbelt行!但爲什麼imageview不更新? – hasanghaforian 2014-10-03 18:58:50

+0

我看不到你在修改位圖的位置 – Blackbelt 2014-10-03 19:01:25

回答

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 2014-10-03 19:47:30