Android采用双缓冲技术实现画板
作者:请叫我小东子 发布时间:2022-05-28 15:55:58
标签:Android,双缓冲,画板
本文实例为大家分享了Android实现画板的具体代码,采用的技术是双缓冲技术,供大家参考,具体内容如下
1.双缓冲技术的概念
所谓的双缓冲技术其实很简单,当程序需要在指定的View上进行绘制时,程序并不需要直接绘制到该View组件,而是先绘制到一个内存中的Bitmap图片上(就是缓冲),等内存中的Bitmap绘制好之后,再一次性将Bitmap绘制到View组件上。
2.Android采用双缓冲实现画板
实现的思路:
1).定义一个内存中图片,将他作为缓冲区Bitmap cacheBitmap = null;
2).定义缓冲区Cache的Canvas对象 Canvas cacheCanvas = null;
3).设置cacheCanvas将会绘制到内存的bitmap上。
cacheCanvas.setBitmap(cacheBitmap);
4). 将cacheBitmap绘制到该View上.
canvas.drawBitmap(cacheBitmap,0,0,p);
3.代码实现
package com.lidong.android_ibrary.view;
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;
/**
*@类名 : DrawView
*@描述 : 使用双缓存技术实现绘制
*@时间 : 2016/4/26 9:18
*@作者: 李东
*@邮箱 : lidong@chni.com.cn
*@company: chni
*/
public class DrawView extends View {
float preX;
float preY;
private Path path;
private Paint paint = null;
private int VIEW_WIDTH = 800;
private int VIEW_HEIGHT = 600;
//定义一个内存中图片,将他作为缓冲区
Bitmap cacheBitmap = null;
//定义缓冲区Cache的Canvas对象
Canvas cacheCanvas = null;
public DrawView(Context context) {
this(context,null);
}
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
//创建一个与该VIew相同大小的缓冲区
cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH,VIEW_HEIGHT,Bitmap.Config.ARGB_8888);
//创建缓冲区Cache的Canvas对象
cacheCanvas = new Canvas();
path = new Path();
//设置cacheCanvas将会绘制到内存的bitmap上
cacheCanvas.setBitmap(cacheBitmap);
paint = new Paint();
paint.setColor(Color.RED);
paint.setFlags(Paint.DITHER_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
paint.setAntiAlias(true);
paint.setDither(true);
}
@Override
protected void onDraw(Canvas canvas) {
Paint p = new Paint();
//将cacheBitmap绘制到该View
canvas.drawBitmap(cacheBitmap,0,0,p);
canvas.drawPath(path,paint);
}
@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:
//这是是调用了cacheBitmap的Canvas在绘制
cacheCanvas.drawPath(path,paint);
path.reset();
break;
}
invalidate();//在UI线程刷新VIew
return true;
}
}
4.实现的效果
代码下载:Android实现画板代码


猜你喜欢
- 队列和堆栈都是约束版的链表,就像在超市购物,队列是先进先出的数据结构。接着上一篇,派生于链表类List,来模拟一个队列。namespace
- ThreadLocal简介ThreadLocal 是 Java 中的一个线程本地存储机制,它允许每个线程拥有一个独立的本地存储空间
- Pattern类定义 public final class Pattern
- 以前编程的时候,遇到倒计时的功能时,经常自己去写,但其实Android已经帮封装好了一个倒计时类CountDownTimer,其实是将后台线
- 一、javaweb中前端向后端传值的几种方式1.查询字符串的方式即在请求地址后拼接上请求参数,多个参数以&连接- 表单方式提交2.第
- 新公司工程是用Maven管理的,技术上使用了JPA,但是我导入工程到MyEclipse时,applicationContext.xml中提示
- 本文实例为大家分享了android自定义imageview实现圆角图片的具体代码,供大家参考,具体内容如下自定义图片的属性,对图片进行圆角切
- 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....程序设计:public class exp2{ publi
- Spring Cloud Gateway介绍前段时间刚刚发布了Spring Boot 2正式版,Spring Cloud Gateway基于
- 具体不做详细介绍了,结合案例给大家做剖析,具体如下:条件“或”运算符 (||) 执行 bool 操作数的逻辑“或”运算,但仅在必要时才计算第
- kafka是什么?Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式
- 按照常规思维,往一个map里put一个已经存在的key,会把原有的key对应的value值覆盖,然而通过一次线上问题,发现Java8中的Co
- java调用python的几种用法如下:在java类中直接执行python语句在java类中直接调用本地python脚本使用Runtime.
- 本文实例为大家分享了C#使用NPOI实现Excel导入导出的具体代码,供大家参考,具体内容如下Excel导入使用OpenFileDiolog
- springboot集成 redispom文件<dependency> <groupId>
- 在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法:在
- 如果项目中使用到了MyBatis框架,那么使用通用Mapper和PageHelper分页插件将极大的简化我们的操作。通用Mapper可以简化
- 本文的目的是要实现左右滑动的指引效果。那么什么是指引效果呢?现在的应用为了有更好的用户体验,一般会在应用开始显示一些指引帮助页面,使用户能更
- 首先我先声明一点,本文单纯就是技术探讨,要从实际应用中来说的话,我并不建议这样去玩分布式事务、也不建议这样去玩多数据源,毕竟分布式事务主要还
- 1. Consul 简介Consul是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服 务注册与