当前位置: 首页 > news >正文

Android自定义view双缓存技术

自定义一个写字板来帮助理解双缓存。如果不使用双缓存那么用户只能看到绘制的最后一笔的效果。因为在不断调用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;
    }
}

 



 



效果图:用模拟器画的效果没有真机好
 

相关文章:

  • Linux命令行下运行java.class文件
  • nmap入门之其他
  • 实现IOC功能的简单Spring框架
  • 如何将GridViewEX升级到UWP(Universal Windows Platform)平台
  • Windows环境下安装 mysql-8.0.11-winx64 遇到的问题解决办法
  • LinuxMint下Docker的安装部署和验证
  • Vue-cli / webpack 加载静态js文件的方法
  • python函数的动态传参.作用域与命名空间
  • static DEVICE_ATTR(val, S_IRUGO | S_IWUSR, hello_val_show, hello_val_store); 的作用
  • 几分钟内提升技能的8个 JavaScript 方法!
  • HTTP请求中的form data和request payload的区别
  • Linux内核-协议栈-从BSD Socket接口层到传输层1
  • centos7全离线安装MongoDB3.2.8集群
  • Java基础学习18(类的多态性以及子父类之间的转换机制)
  • Python的三种基本数据类型
  • [数据结构]链表的实现在PHP中
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Docker容器管理
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • php ci框架整合银盛支付
  • Python 反序列化安全问题(二)
  • Quartz初级教程
  • React Native移动开发实战-3-实现页面间的数据传递
  • Redux 中间件分析
  • 深入 Nginx 之配置篇
  • 树莓派 - 使用须知
  • 小程序开发中的那些坑
  • 鱼骨图 - 如何绘制?
  • # 数据结构
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三)c52学习之旅-点亮LED灯
  • (三)elasticsearch 源码之启动流程分析
  • (转)Windows2003安全设置/维护
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET MVC第三章、三种传值方式
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 使用ajax控件后如何调用前端脚本
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @Transient注解
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [Android]使用Android打包Unity工程
  • [android学习笔记]学习jni编程
  • [C++]——带你学习类和对象
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [CISCN2019 华东南赛区]Web11
  • [ERROR] ocp-server-ce-py_script_start_check-4.2.1 RuntimeError: ‘tenant_name‘
  • [ESP32] 编码旋钮驱动
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [FUNC]判断窗口在哪一个屏幕上