2

別の操作中に、ビットマップのピクセルを 1 秒ごとに操作し、結果を に表示する必要があり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();
}
}

上記のメソッドは、UI スレッド (onclickボタンのイベント) から次のように呼び出されます。

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

アプリの実行中は、アプリのクラッシュや ANR は問題ありませんが、ImageView( iv1) は更新されません。コードをデバッグすると、ビットマップのピクセルが操作されています。try/catchまた、ブロックのコメントを外しましたが、結果は同じでした。

奇妙です: while ブロックの開始と終了にコメントを付けると、ビットマップが正しく操作され (1 回と 1 回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 に答える