好幾天前就想問了,關於雙緩衝移動畫面出現殘影的有關問題

tags:    時間:2013-12-16 05:34:59
好幾天前就想問了,關於雙緩衝移動畫面出現殘影的問題。
大家好,這個問題前陣子就想問了,可是前幾天csdn論壇關閉了,也沒地方可以問。入正題。
主要問題就是我運用雙緩衝來畫瓦片組成的一整幅圖,使用非同步線程下載,每次移動后判定需要載入那幾塊圖片,先查緩存,緩存里有直接取出畫上去,緩存沒有進入非同步線程下載,下好了,畫上去。我沒有用surfaceview,直接在view上畫使用canvas.drawbitmap(bitmap,x,y,null),之前出現了閃爍現象,使用雙緩衝解決了閃爍,可是出現一個問題了,緩存里有的也就是載入過的我移動沒有問題,很好,可是移動到沒有載入過的,就是需要下載的地方,在沒有下載好以前那些地方都是之前了留下的畫面,等下載好了后他會自動刷新上去,這樣造成了一個很不好的視覺感受,我想實現在沒有下載好的地方直接給他填上空白,這樣等下載好了再直接貼上去,而不要有之前留下的殘影,我分析這個殘影是雙緩衝開始內存里那個圖留下的,試了好幾種方法了都不能解決,上來請教下大家,有沒有什麼好的建議?我貼下我的雙緩衝部分代碼。
預畫圖,就是內存里畫圖的部分
Java code
               public void preDraw(Tile tile){         cacheCanvas.setBitmap(cacheBitmap);         Bitmap bitmap = tile.getBitmap();//獲得要畫的方塊         Point scPt = tile.getScreenPos();//獲得要畫的方塊需要畫的位置         if(bitmap != null){             cacheCanvas.drawBitmap(bitmap, scPt.x, scPt.y, null);         }         map.invalidate();         Log.d("預畫圖完成", "顯示至界面");     } 

ondraw函數很簡單的啦。。。
Java code
              public void onDraw(Canvas canvas) {         canvas.drawBitmap(cacheBitmap, 0, 0, null);         Log.d("完成畫圖","ok");     }  

我再貼個殘影的圖吧讓大家知道我這個殘影是什麼個情況。






通過上面兩張圖大家應該能看出來是什麼問題了吧?每次剛拖動時會這樣,等後台下載好了會自動更新好,移動到之前已經看過的地方就不會又殘影。。。

------解決方案--------------------
是不是忘記清空畫布了???
------解決方案--------------------
看邏輯應該是局部更新,而preDraw應該沒有清除這個局部的畫布,導致的重疊吧
------解決方案--------------------
兩種解決方案:
1,既然你說緩存里有的,不會有問題,也就是說緩存里無論放的是地圖還是你自己的圖片,顯示都不會出問題,所以,你在圖片下載之前,你可以在緩存里放一張背景圖片,百度,google,Mapabc 好像都是這麼乾的。
2. 你是不是一整個地圖就是一個view? 我覺得從設計上來講這不是個好的方案。整個地圖可以為一個Container,每一小塊地圖是一個view,這樣的話,從邏輯上更好控制。
------解決方案--------------------
canvas.drawColor(0x0);

推薦閱讀文章

Bookmark the permalink ,來源:互聯網