在處理一些複雜的介面時,往往要用view,SurfaceView來自己處理畫圖。比如用SurfaceView來貼兩張圖,並控制他們左右平移,基本代碼如下:
Java代碼
Canvas c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
if (c != null) {
c.setDrawFilter(mFilter);
c.drawRect(0, 0, c.getWidth(), c.getHeight(), mBGPaint); //畫背景
c.drawBitmap(bm1, 0, 0, null);
c.drawBitmap(bm2,bm1.getWidth(), 0, null); //第二張圖畫在第一張旁邊
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
控制它左右平移時,會發現螢幕非常閃爍,眼睛看著會非常累。研究以後發現,這是因為兩張圖是依次一張一張貼到螢幕上的,如果重新整理頻率高的話,會使螢幕非常的閃爍。
解決的辦法其實非常簡單,想起J2ME下開發解決畫圖閃爍的辦法,先把要畫的圖先畫好放在一張大的記憶體位元影像上,然後一下貼到螢幕。Android其實也是一樣的,上面的問題解決方案如下:
Java代碼
final Bitmap memBm = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.RGB_565);
final Canvas c = new Canvas(memBm);
c.setDrawFilter(mFilter);
c.drawRect(0, 0, c.getWidth(), c.getHeight(), mBGPaint); //畫背景
c.drawBitmap(bm1, 0, 0, null);
c.drawBitmap(bm2,bm1.getWidth(), 0, null); //第二張圖畫在第一張旁邊
Canvas render = null;
try {
render = mSurfaceHolder.lockCanvas();
if (render != null) {
render.drawBitmap(memBm, 0, 0, null);
}
} finally {
if (render != null)
mSurfaceHolder.unlockCanvasAndPost(render);
}
memBm.recycle(); //記得回收記憶體位元影像
這樣處理後,view重新整理將變得平滑,眼睛看著舒服多了。
摘自 wanghao_happy的專欄