Android採用雙緩衝技術實現畫板

Android採用雙緩衝技術實現畫板

本文例項為大家分享了Android實現畫板的具體程式碼,採用的技術是雙緩衝技術,供大家參考,具體內容如下

1.雙緩衝技術的概念

所謂的雙緩衝技術其實很簡單,當程式需要在指定的View上進行繪製時,程式並不需要直接繪製到該View元件,而是先繪製到一個記憶體中的Bitmap圖片上(就是緩衝),等記憶體中的Bitmap繪製好之後,再一次性將Bitmap繪製到View元件上。

2.Android採用雙緩衝實現畫板

 實現的思路:

1).定義一個記憶體中圖片,將他作為緩衝區Bitmap cacheBitmap = null;
2).定義緩衝區Cache的Canvas物件 Canvas cacheCanvas = null;
3).設定cacheCanvas將會繪製到記憶體的bitmap上。
cacheCanvas.setBitmap(cacheBitmap);
4). 將cacheBitmap繪製到該View上.
canvas.drawBitmap(cacheBitmap,0,0,p);

3.程式碼實現


package com.lidong.android_ibrary.view;
import android.content.Context;
import android.graphics.Bitmap;
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;
/**
*@類名 : DrawView
*@描述 : 使用雙快取技術實現繪製
*@時間 : 2016/4/26 9:18
*@作者: 李東
*@郵箱 : [email protected]
*@company: chni
*/
public class DrawView extends View {
float preX;
float preY;
private Path path;
private Paint paint = null;
private int VIEW_WIDTH = 800;
private int VIEW_HEIGHT = 600;
//定義一個記憶體中圖片,將他作為緩衝區
Bitmap cacheBitmap = null;
//定義緩衝區Cache的Canvas物件
Canvas cacheCanvas = null;
public DrawView(Context context) {
this(context,null);
}
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
//建立一個與該VIew相同大小的緩衝區
cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH,VIEW_HEIGHT,Bitmap.Config.ARGB_8888);
//建立緩衝區Cache的Canvas物件
cacheCanvas = new Canvas();
path = new Path();
//設定cacheCanvas將會繪製到記憶體的bitmap上
cacheCanvas.setBitmap(cacheBitmap);
paint = new Paint();
paint.setColor(Color.RED);
paint.setFlags(Paint.DITHER_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
paint.setAntiAlias(true);
paint.setDither(true);
}
@Override
protected void onDraw(Canvas canvas) {
Paint p = new Paint();
//將cacheBitmap繪製到該View
canvas.drawBitmap(cacheBitmap,0,0,p);
canvas.drawPath(path,paint);
}
@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:
//這是是呼叫了cacheBitmap的Canvas在繪製
cacheCanvas.drawPath(path,paint);
path.reset();
break;
}
invalidate();//在UI執行緒重新整理VIew
return true;
}
}

4.實現的效果

程式碼下載:Android實現畫板程式碼