android中的Surfaceview实现了双缓冲机制,所谓双缓冲,就是会保存上一次绘图的内容,然后再上一次的基础上继续绘图,这样是为了保证绘制的图像不丢失。
但是view本身并没有实现双缓冲机制,下面我们来模拟一下双缓冲
先说明一下思路:当程序再view绘图是,并不直接绘制在view上,而是绘制到内存中的bitmap图片上,等内存中的bitmap绘制好了之后,在一次性把bitmap绘制到view
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 MyView extends View {
float preX;
float preY;
private Path path;
public Paint paint = null;
final int VIEW_WIDTH = 640;
final int VIEW_HEIGHT = 960;
//定义一个内存中的图片,该图片将作为缓冲区
Bitmap cacheBitmap = null;
//定义cacheBitmap上的canvas对象
Canvas cacheCanvas = null;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
//创建一个与该View相同大小的缓存区
cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH,VIEW_HEIGHT,Config.ARGB_8888);
cacheCanvas = new Canvas();
path = new Path();
//设置cacheCanvas将会绘制到内存中的cacheBitmap上
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);
}
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();
//返回true表明处理方法已经处理该事件
return true;
}
public void onDraw(Canvas canvas)
{
Paint bmpPaint = new Paint();
//将cacheBitmap绘制到该View组件上
canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint);
//沿着path绘制
canvas.drawPath(path, paint);
}
}