Android自定义view双缓存技术
来源:互联网 发布:淘宝想开情趣用品店 编辑:程序博客网 时间:2024/06/16 07:25
双缓存说白了就是有两个绘图区域,一个是bitmap的canvas另一个是当前view的canvas。先将图形绘制在bitmap上,然后将bitmap绘制在view上,也就是说,我们在view上看到的效果其实就是bitmap上的内容。这样做的好处有以下几点:
提高绘图性能
可以在屏幕上展示绘图的过程
保存绘制的历史
自定义一个写字板来帮助理解双缓存。如果不使用双缓存那么用户只能看到绘制的最后一笔的效果。因为在不断调用invalidate(),未保存的绘制过程会消失。
package newviews;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;/** * Created by yuanteng on 2017/9/11. */public class DrawNsmeView extends View {; private Paint paint; private Path path; //绘图是用于缓存绘制过程的bitmap private Bitmap bufferBitmap; private Canvas bufferCanvas; private int preX,preY; public DrawNsmeView(Context context, AttributeSet attrs) { super(context, attrs); path = new Path(); paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); paint.setStrokeWidth(5); paint.setStyle(Paint.Style.STROKE); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); int width = getMeasuredWidth(); int height = getMeasuredHeight(); bufferBitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888); if (bufferCanvas == null){ bufferCanvas = new Canvas(bufferBitmap); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(bufferBitmap,0,0,null); // canvas.drawPath(path,paint); } @Override public boolean onTouchEvent(MotionEvent event) { int x = (int)event.getX(); int y = (int)event.getY(); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: //重置path 清除path中保存的数据 path.reset(); preX = x; preY = y; //将起点移动到此处 path.moveTo(x,y); break; case MotionEvent.ACTION_MOVE: //画贝塞尔曲线,贝塞尔曲线比bufferCanvas.drawLine();画出来的曲线更平滑 path.quadTo(preX,preY,x,y); //通知重绘制view bufferCanvas.drawPath(path,paint); invalidate(); preY = y; preX = x; break; case MotionEvent.ACTION_UP: //抬起时将path绘制在buffer中保存,并崇绘制view,崇绘制的时候回绘制buffer bufferCanvas.drawPath(path,paint); invalidate(); break; } return true; }}
效果图:用模拟器画的效果没有真机好
阅读全文
0 0
- Android自定义view双缓存技术
- android 自定义view 缓存技术
- [Android技术专题]自定义View
- Android View---自定义View
- Android View---自定义View
- Android View 双缓冲技术
- android view缓存
- 【Android应用开发技术:用户界面】自定义View类设计
- Android自定义View绘图基础(摘自技术前沿)
- 【Android应用开发技术:用户界面】自定义View类设计
- 双缓存绘图 自定义刮奖效果View
- Android 自定义View 之 自定义View属性
- 【自定义View系列】android自定义View概述
- Android 自定义View双指放大
- Android中 view的双缓冲技术
- Android中 view的双缓冲技术
- Android自定义view自定义属性
- Android自定义控件 -- 自定义View
- okhttp框架学习
- maven依赖json-lib的jar包导入失败
- [unity3d] 模型XRay效果实现
- 初窥ajax(一) ——封装ajax
- Class文件结构
- Android自定义view双缓存技术
- HTML/CSS导航菜单-水平菜单的制作
- 设计模式应用 生成器模式
- ZigBee_CC2530中断的使用
- 用最大似然估计求逻辑回归参数
- 查询相关
- 机房收费系统 之 建筑地基
- 40.Set、Map、TreeSet、TreeMap操作代码实战
- SGISTL源码探究-关联式容器:multiset