您的位置:首页 > 移动开发 > Android开发

android 双缓冲分析一些基本的原理

2015-12-27 19:19 627 查看
当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。

 双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:

  1、在内存中创建与画布一致的缓冲区

  2、在缓冲区画图

  3、将缓冲区位图拷贝到当前画布上

  4、释放内存缓冲区

下面的例子(一个画图板)将实现双缓冲画图

先自定义一个View(Bitmap将会绘制到这个View上)

这里主要理解:一些基本的原理,详细看代码注释

public class DoubleBitmap extends View {

private Bitmap mCachBitMap;//缓冲画布

private Canvas mCanvas;//画图

private Paint mPaint;//画布

private Path  mPath;

private int x,y,dx,dy;

public DoubleBitmap(Context context) {
this(context, null);
}

public DoubleBitmap(Context context, AttributeSet attrs) {
super(context, attrs);

mPaint=new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(3);
mPaint.setColor(Color.RED);
mPaint.setAntiAlias(true);

mPath=new Path();

}
//监听view的大小变化,间接去调用OnMeasure(),onLayout()
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);//先测量过后才能获取View的宽和高

mCachBitMap= Bitmap.createBitmap(getMeasuredWidth(),getMeasuredHeight(), Bitmap.Config.ARGB_8888);

mCanvas=new Canvas(mCachBitMap);//把缓冲画布绑定到新创建的canvas对象上面去

}

@Override
public boolean onTouchEvent(MotionEvent event) {

x=(int)event.getX();

y=(int)event.getY();

switch (event.getAction()){

case MotionEvent.ACTION_DOWN:

dx=x;
dy=y;

mPath.moveTo(dx,dy);

break;

case MotionEvent.ACTION_MOVE:

mPath.quadTo(dx,dy,x,y);//绘制二阶贝塞尔曲线

dx=x;
dy=y;

break;

case MotionEvent.ACTION_UP:

mCanvas.drawPath(mPath, mPaint);//用自定义的cavas对象绘制path

mPath.reset();//path重置

break;

}

invalidate();//时刻准备重绘

return true;
}

@Override
protected void onDraw(Canvas canvas) {

canvas.drawBitmap(mCachBitMap,0,0,mPaint);//把缓存画布上的内容绘制到View默认画布上面去 一次性拷贝过来,避免屏幕闪烁

canvas.drawPath(mPath, mPaint);

super.onDraw(canvas);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: