android 双缓冲分析一些基本的原理
2015-12-27 19:19
627 查看
当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。
双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:
1、在内存中创建与画布一致的缓冲区
2、在缓冲区画图
3、将缓冲区位图拷贝到当前画布上
4、释放内存缓冲区
下面的例子(一个画图板)将实现双缓冲画图
先自定义一个View(Bitmap将会绘制到这个View上)
这里主要理解:一些基本的原理,详细看代码注释
双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:
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); } }
相关文章推荐
- 安卓开发全屏实现方法
- android sdk manager的国内代理
- Android Studio安装及配置
- Android适配器之 ArrayAdapter
- Android异步载入全解析之IntentService
- Android JNI技术, NDK开发
- 转 Android屏幕适配全攻略(最权威的官方适配指导)
- Android SDK Manager国内下载缓慢的问题
- Android 开源项目EventBus详解
- RxAndroid与RxJava 变换
- Android singleTask或singleInstance与startActivityForResult冲突解决
- Android之使用递归删除文件或文件夹
- android 系统短信数据库的查询与删除
- Android选择头像(从相机-相册-截图获取),以及闪退的解决
- Android中如何关闭所有的Activity
- 使用Android studio 提交代码无反应的处理办法
- Android之判断service是否处于运行状态
- Android在ImageView控件中图片怎样铺满整个控件
- Android自动化工具的选型对比
- android studio 下载地址