Android学习笔记3-绘图,双缓冲机制
来源:互联网 发布:c语言心型示爱代码 编辑:程序博客网 时间:2024/05/02 04:25
双缓冲机制其实很简单,就是通过一个内存中的bitmap将绘画轨迹记录下来,然后再绘制到view上面。
下面的例子来自于《疯狂Android讲义》,简单易懂,这本书很适合初学者.
public class DrawView extends View { float preX; float preY; private Path path; public Paint paint = null; final int VIEW_WIDTH = 900; final int VIEW_HEIGHT = 1024; //定义一个内存中的图片, 该图片将作为缓冲区 Bitmap cacheBitmap = null; //定义cacheBitmap上的Canvas对象 Canvas cacheCanvas = null; public DrawView(Context context, AttributeSet set){ super(context, set); //创建一个与该view相同大小的缓冲区 cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT, Bitmap.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); } @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; } // Log.i("ysong", "调用了invalidate()函数"); invalidate(); return true; } @Override protected void onDraw(Canvas canvas) { Paint bmpPaint = new Paint(); //将cacheBitmap绘制到该View组件上 canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint); //沿着path绘制 canvas.drawPath(path, paint); //为什么还要绘制一次path??? //这行代码非常重要, //每次手指在屏幕上面移动,path会将轨迹记录下来,然后绘制到缓冲的bitmap上面 // view 每次调用invalidate()更新的时候,会将bitmap上面缓冲的内容绘制到view上面(也就是canvas) // ACTION_MOVE 和 ACTION_DOWN 也会触发invalid()更新view,这个时候path的内容还没有绘制到cacheBitmap上面, // 如果没有上面这行canvas.drawPath(path, paint), 效果就会是当手指离开屏幕时,之前绘制的轨迹才会出现,感觉像是慢了半拍 // 有了上面这一行代码,当ACTION_MOVE手指移动的时候,就会把临时的path绘制到view上面,这样感觉像是画笔随着手指在动 // 最后再把cacheBitmap的内容绘制到view上面 //ACTION_MOVE 其实并不是从手指DOWN到UP的过程,其中会触发很多次invalid()函数, // ACTION_MOVE其实包含了两个动作,只不是期间的时间间隔非常短, 看起来感觉像是一个动作, 可以通过log来测试一下,看一下移动调用了多少次invalidate() }}
0 0
- Android学习笔记3-绘图,双缓冲机制
- Android 双缓冲绘图机制
- android 绘图之双缓冲绘图
- Android SurfaceView双缓冲绘图
- Android SurfaceView双缓冲绘图
- android 双缓冲机制
- Qt学习之路-简易画板3(双缓冲绘图)
- 安卓绘图的双缓冲机制(看了疯狂Android的双缓冲,自己的一点点感想)
- 学习OpenGL(二)双缓冲绘图
- android双缓冲绘图,避免屏幕闪烁
- 关于android双缓冲绘图的分析
- android绘制知识--双缓冲绘图技术
- android双缓冲绘图技术分析
- Android SurfaceView 双缓冲机制
- 内存绘图、双缓冲绘图
- 内存绘图、双缓冲绘图
- 双缓冲绘图
- GDI双缓冲绘图
- Codeforces Round #325 (Div. 2)ABC
- LeetCode--No.235--Lowest Common Ancestor of a Binary Search Tree
- 树状数组
- wordpress数据库配置文件wp-config.php
- Spark小象学院笔记
- Android学习笔记3-绘图,双缓冲机制
- LintCode_512 Decode Ways
- Copy List with Random Pointer
- 2D Fast Marching Computations
- [leetcode] 376. Wiggle Subsequence 解题报告
- C++任务队列与多线程
- 使用epoll&socket的总结
- iframe与父窗口的交互.
- 游戏服务器ID生成器组件