2

在另一次操作期间,我必须每隔一秒处理一次位图的像素,并将结果显示在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();
}
}

onclick通过这种方式从 UI 线程(按钮事件)调用上述方法:

runOnUiThread(new Runnable() {
    public void run() {
        overlay(bmp);
    }
});

App运行时没有问题,App crash或者ANR,但是ImageView( iv1)没有更新。我调试代码和位图的像素正在操纵。我也取消注释try/catch块,但结果是一样的。

奇怪的是:当我评论 while 块的开始和结束时,位图操作正确(一次和 for 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?我做错什么了吗?

4

1 回答 1

0

尝试将循环移到 UI 线程之外,然后在 UI 线程中运行 setImageBitmap 调用。就像是:

// from non-UI thread:
while (flag) {
    // perform image manipulation
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            iv1.setImageBitmap(tempBmp);
        }
    });
}
于 2014-10-03T19:31:14.010 回答