使用雙緩沖技術實現Android畫板應用

什麼是雙緩沖技術?雙緩沖技術就是當用戶操作界面完成後,會有一個緩沖區保存用戶操作的結果。
 
為什麼要使用雙緩沖技術?拿Android 遊戲開發來說,界面貞每次都是全部重畫的,也就說畫瞭新的,舊的就沒瞭,所以需要使用雙緩沖技術保存之前的內容。
 
如何實現雙緩沖?使用一個Bitmap對象保留之前的畫佈即可。
 
 
 
 
 
[java]
package com.example.phonegaptest; 
 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
 
public class DrawView extends View { 
    float preX; 
    float preY; 
    private Path path; 
    public Paint paint = null; 
    final int VIEW_WIDTH = 320; 
    final int VIEW_HEIGHT = 480; 
    Bitmap cacheBitmap = null; 
    Canvas cacheCanvas = null; 
 
    public DrawView(Context context, AttributeSet set) { 
        super(context, set); 
        cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT, 
                Config.ARGB_8888); 
        cacheCanvas = new Canvas(); 
 
        path = new Path(); 
        cacheCanvas.setBitmap(cacheBitmap); 
 
        paint = new Paint(Paint.DITHER_FLAG); 
        paint.setColor(Color.RED); 
        paint.setStyle(Paint.Style.STROKE); 
        paint.setStrokeWidth(1); 
        paint.setAntiAlias(true); 
        paint.setDither(true); 
    } 
 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
        float x = event.getX(); 
        float y = event.getY(); 
 
        switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
            path.moveTo(x, y); 
            preX = x; 
            preY = y; 
            break; 
        case MotionEvent.ACTION_MOVE: 
            path.quadTo(preX, preY, x, y); 
            preX = x; 
            preY = y; 
            break; 
        case MotionEvent.ACTION_UP: 
            cacheCanvas.drawPath(path, paint); 
            path.reset(); 
            break; 
        } 
        invalidate(); 
        return true; 
    } 
 
    @Override 
    protected void onDraw(Canvas canvas) { 
        super.onDraw(canvas); 
        Paint bmpPaint = new Paint(); 
        canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint); 
        canvas.drawPath(path, paint); 
    } 
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。