Android中 view的雙緩衝技術

view實現雙緩衝技術

當要繪製的數據量比較大,繪圖時間比較長時,重複繪圖會出現閃爍現象,引起閃爍現象的主要原因是視覺反差比較大。

使用雙緩衝技術可以解決這個問題,Surfaceview默認是使用雙緩衝技術的。

在Android上實現雙緩衝技術的步驟是:

創建一個屏幕大小(實際繪圖區域)的緩衝區(Bitmap),創建一個畫布(Canvas),然後設置畫布的bitmap爲創建好的緩衝區,

把需要繪製的圖像繪製到緩衝區上。最後把緩衝區中的圖像繪製到屏幕上。

具體實現代碼如下:

public class DrawView4 extends View {
    private int screenWidth,screenHeight;
    public DrawView4(Context context) {
        super(context);
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        screenWidth = dm.widthPixels;
        screenHeight = dm.heightPixels;
    }


    public Bitmap decodeBitmapFromRes(Context context, int resourceId) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        options.inPurgeable = true;
        options.inInputShareable = true;

        InputStream in = context.getResources().openRawResource(resourceId);
        return BitmapFactory.decodeStream(in, null, options);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        //1. 創建緩衝畫布
        Canvas bufferCanvas = new Canvas();
        //2. 創建緩存Bitmap
        Bitmap bufferBitmap = Bitmap.createBitmap(screenWidth,screenHeight, Bitmap.Config.ARGB_8888);
        //3. 將緩衝位圖設置給緩衝畫布
        bufferCanvas.setBitmap(bufferBitmap);
        //4. 在緩衝畫布上繪製真實的位圖
        bufferCanvas.drawBitmap(decodeBitmapFromRes(getContext(), R.drawable.ic_launcher), 0, 0, null);
        //5. 用屏幕的畫布繪製緩衝位圖
        canvas.drawBitmap(bufferBitmap,0,0, null);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章