我遇到過需要以非常快的速度切換圖像的幻燈片顯示圖像的情況。數量龐大的圖像讓我想要將JPEG數據存儲在內存中,並在需要顯示時解碼它們。爲了緩解垃圾收集器,我使用BitmapFactory.Options.inBitmap來重用位圖。BitmapFactory.Options.inBitmap在切換ImageView位圖時會導致撕裂
不幸的是,這造成了相當嚴重的撕裂,我試過不同的解決方案,如同步,信號量,2-3位圖之間交替,然而,似乎沒有解決問題。
我已經在GitHub上設置了一個演示此問題的示例項目; https://github.com/Berglund/android-tearing-example
我有,其解碼位圖,將其設置在UI線程上一個線程,休眠5毫秒:
Runnable runnable = new Runnable() {
@Override
public void run() {
while(true) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
if(bitmap != null) {
options.inBitmap = bitmap;
}
bitmap = BitmapFactory.decodeResource(getResources(), images.get(position), options);
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
try {
Thread.sleep(5);
} catch (InterruptedException e) {}
position++;
if(position >= images.size())
position = 0;
}
}
};
Thread t = new Thread(runnable);
t.start();
我的想法是,ImageView.setImageBitmap(位圖)上繪製位圖下一個vsync,但是,當發生這種情況時,我們可能已經解碼了下一個位圖,因此我們已經開始修改位圖像素。我正在朝着正確的方向思考?
有沒有人有從哪裏去的任何提示?
'ImageView'是必需的嗎?我建議'SurfaceView'或'TextureView'獲得較高的抽獎率。 – 2013-03-24 15:48:48
我面臨着同樣的撕裂,但在不同的情況下。我無法提出問題,因爲這個屁股stackoverflow政策。請幫助我一個人。這對我來說是一個很大的幫助。 – therealprashant 2015-02-16 18:41:12