没有废话,简单粗暴。

1.创建一个自定义 view

创建一个 DrawView,继承自 android.view.View 类。在这个类中,先定义所需的属性,再创建一个构造方法。

public class DrawView extends View {private int view_width = 0;//画板宽度private int view_height = 0;//画板高度private float preX;//起始点的 x 坐标private float preY;//起始点的 y 坐标private Path path;//路径public Paint paint = null;//画笔Bitmap cacheBitmap = null;//定义一个内存中的图片,该图片作为缓冲区Canvas cacheCanvas = null;//定义 cacheBitmap 上的 Canvas 对象/*构造方法*/public DrawView(Context context, AttributeSet set){super(context,set);}/*重写 onDraw 方法*/@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);}}

2.修改 xml 文件

修改 activity_main.xml 文件,并将自定义的 DrawView 添加到布局管理器中。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><com.example.test.DrawView
        android:id="@+id/drawView1"android:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout>

3.DrawView 的构造方法

在 DrawView 的构造方法中,首先获取屏幕的宽度和高度,并创建一个与该 view 相同大小的缓存区,然后创建一个新的画面,并实例化一个路径,再讲内存中的位图绘制到 cacheCanvas 中,最后实例化一个画笔,并设置画笔的相关属性。

//获取屏幕宽度view_width = context.getResources().getDisplayMetrics().widthPixels;//获取屏幕高度view_height = context.getResources().getDisplayMetrics().heightPixels;cacheBitmap = Bitmap.createBitmap(view_width,view_height, Bitmap.Config.ARGB_8888);//创建一个新的画布cacheCanvas = new Canvas();path = new Path();//在 cacheCanvas 上绘制 cacheBitmapcacheCanvas.setBitmap(cacheBitmap);paint = new Paint(Paint.DITHER_FLAG);//设置默认的画笔颜色paint.setColor(Color.RED);//设置填充方式为描边paint.setStyle(Paint.Style.STROKE);//设置笔刷的图形样式paint.setStrokeJoin(Paint.Join.ROUND);//设置画笔转弯处的连接风格paint.setStrokeCap(Paint.Cap.ROUND);//设置默认的画笔的宽度paint.setStrokeWidth(1);//使用抗锯齿功能paint.setAntiAlias(true);//使用抖动效果paint.setDither(true);

4.重写 onDraw 方法

在 DrawView 的 onDraw 方法中,设置背景颜色,绘制 cacheBitmap,绘制路径以及保存当前的状态到栈中,并调用 restore()方法恢复所保存的状态。

//设置背景颜色canvas.drawColor(0xFFFFFFFF);//采用默认设置创建一个画笔Paint bmpPaint = new Paint();//绘制cacheBitmapcanvas.drawBitmap(cacheBitmap,0,0,bmpPaint);//绘制路径canvas.drawPath(path,paint);//保存 canvas 状态canvas.save(Canvas.ALL_SAVE_FLAG);//恢复 canvas 之前的保存状态,防止保存后对 canvas 执行的操作最后续的绘制有影响canvas.restore();

5.重写 onTouchEvent 方法

在 DrawView 类中,重写onTouchEvent() 方法,为该视图添加触摸时间监听器,在该方法中,首先获取触摸时间发生的位置,然后应用 switch 对时间的不同状态添加响应代码,最后调用invalidate()方法更新视图。

@Overridepublic boolean onTouchEvent(MotionEvent event) {//获取触摸时间发生的位置float x = event.getX();float y = event.getY();switch (event.getAction()){case MotionEvent.ACTION_DOWN://将绘图的起始点移到(x,y)的坐标位置path.moveTo(x,y);preX = x;preY = y;break;case MotionEvent.ACTION_MOVE:float dx = Math.abs(x-preX);float dy = Math.abs(y-preY);//判断是否在允许的范围内if (dx>=5 || dy >= 5){path.quadTo(preX,preY,(x+preX)/2,(y+preY)/2);preX = x;preY = y;}break;case MotionEvent.ACTION_UP://绘制路径cacheCanvas.drawPath(path,paint);path.reset();break;}invalidate();//返回 true,表示处理方法已经处理该事件return true;}

6.编写 clear() 方法

写一个 clear() 方法,用来实现橡皮擦功能。

 public void clear() {//设置图形重叠时的处理方式paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));//设置橡皮擦的宽度paint.setStrokeWidth(50);}

7.编写 save() 方法

写一个方法,用来保存当前的绘图。


public void save() {try {saveBitmap("myPicture");}catch (IOException e){e.printStackTrace();}}private void saveBitmap(String filename) throws IOException {//创建文件对象File file = new File("/sdcard/pictures/"+filename+".png");//创建一个新文件file.createNewFile();//创建一个文件输出流对象FileOutputStream out = new FileOutputStream(file);//将绘图内容压缩成 PNG 格式输出到输出流对象中cacheBitmap.compress(Bitmap.CompressFormat.PNG,100,out);//将缓冲区的数据全部写出到输出流中out.flush();//关闭文件输出流对象out.close();}

8.设置权限

 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

9.创建 menu 资源文件

在 res 目录下,创建menu 文件夹,在 menu 文件夹下,创建 toolsmenu.xml 资源文件。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:title="@string/color"><menu ><!-- 定义一组单选菜单项 --><group android:checkableBehavior="single" ><!-- 定义子菜单 --><item android:id="@+id/red" android:title="@string/color_red"/><item android:id="@+id/green" android:title="@string/color_green"/><item android:id="@+id/blue" android:title="@string/color_blue"/></group></menu></item><item android:title="@string/width"><menu ><!-- 定义子菜单 --><group><item android:id="@+id/width_1" android:title="@string/width_1"/><item android:id="@+id/width_2" android:title="@string/width_2"/><item android:id="@+id/width_3" android:title="@string/width_3"/></group></menu></item><item android:id="@+id/clear" android:title="@string/clear"/><item android:id="@+id/save" android:title="@string/save"/>
</menu>

10.添加选项菜单

<1>重写onCreateOptionsMenu方法

在 activity 文件中,重写onCreateOptionsMenu()方法,在该方法中,实例化一个MenuInflater对象,并解析菜单资源文件。

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater menuInflater = new MenuInflater(this);menuInflater.inflate(R.menu.toolsmenu,menu);return super.onCreateOptionsMenu(menu);}

<2>重写onOptionsItemSelected方法

重写onOptionsItemSelected() 方法,分别对各个菜单项被选择时做出相应的处理。

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {//获取自定义视图DrawView drawView = (DrawView)findViewById(R.id.drawView1);//取消擦除效果drawView.paint.setXfermode(null);//初始化画笔的宽度drawView.paint.setStrokeWidth(1);switch (item.getItemId()){//设置画笔的颜色为红色case R.id.red:drawView.paint.setColor(Color.RED);item.setChecked(true);break;//设置画笔的颜色为绿色case R.id.green:drawView.paint.setColor(Color.GREEN);item.setChecked(true);break;//设置画笔的颜色为蓝色case R.id.blue:drawView.paint.setColor(Color.BLUE);item.setChecked(true);break;//设置画笔的宽度为1case R.id.width_1:drawView.paint.setStrokeWidth(1);break;//设置画笔的宽度为5case R.id.width_2:drawView.paint.setStrokeWidth(5);break;//设置画笔的宽度为10case R.id.width_3:drawView.paint.setStrokeWidth(10);break;//擦除绘画case R.id.clear:drawView.clear();break;//保存绘画case R.id.save:drawView.save();break;}return true;}

运行,就会得到一个简易的涂鸦板,可以改变画笔颜色,画笔宽度,擦除,保存等。

真是越来越有意思了呢!

Android 之简易涂鸦板相关推荐

  1. android 简易涂鸦板,canvas实现的简易涂鸦板效果

    用canvas实现的简易涂鸦板效果,用鼠标点击在画布上随意涂鸦 涂鸦 *{ margin: 0; padding: 0; } #canvas1{ box-shadow: 0 5px 40px blac ...

  2. Canvas制作简易涂鸦板

    使用canvas可以做到许多意想不到的功能,尤其动画方面,这次在vue项目中使用canvas制作一个简易涂鸦板 1. html部分代码 <template><div id=" ...

  3. HTML5实例教程——简易涂鸦板-何韬-专题视频课程

    HTML5实例教程--简易涂鸦板-6858人已学习 课程介绍         用CANVES制作一个涂鸦板,让初学者初步了解HTML5的语言与功能. 课程收益     快速学会涂鸦板的做法,同时对HT ...

  4. Android应用开发实例篇(1)-----简易涂鸦板

    一.概述 这次要做一个简单的涂鸦板应用,以前在Qt上实现过,突然想到要把它在Android上实现,呵呵,既简单又有趣. 二.实现 新建工程MyWall,修改/res/layout/main.xml文件 ...

  5. UI进阶--Quartz2D和触摸事件的简单使用:简易涂鸦板

    需求:实现一个简易的涂鸦板应用,使用鼠标在涂鸦板内拖动即可进行涂鸦,点击保存按钮,可以把完成的涂鸦保存,点击回退按钮可以向后退回一步,点击清空可以让涂鸦板清空. 实现步骤: 1.布局storyboar ...

  6. Android小程序-涂鸦板

    最近android课老师布置了一个课后作业,是实现android涂鸦板的功能, 然后自己写了一个简单的涂鸦板,可以实现选择颜色.尺寸.清屏的功能. 首先是效果图: 主要是使用Canvas和Paint来 ...

  7. CGContextRef 实现简易涂鸦板

    写代码之前,先说一下涂鸦,涂鸦是指漫无目的地乱写乱画.今天我们不管乱写,因为乱写只需要一个textview.下面说说如何实现乱画的功能. 说的是一个日本人想要切腹,那他得先找把刀,最次也要弄把改锥来, ...

  8. HTML5简易涂鸦板制作

    运行效果 代码中主要要学会阅读英文单词,务必认真学习English 代码清单1 <!DOCTYPE html> <html><head><meta chars ...

  9. ActionsScript 3.0简易涂鸦板

    使用的编辑器是FlashDevelop(汉化版) 需要注意的是,该例子使用到了Button (属于flash cs3/cs4 中fl组件,位于fl.controls包下,而此编辑器默认不包含fl包) ...

  10. android中留言板功能,js 实现简易留言板功能

    无标题文档 li{list-style:none;} li{position:relative;width:500px;} a{position:absolute;right:10px;} var c ...

最新文章

  1. 比较2个DataTable中的内容是否相同的方法
  2. 使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
  3. blob显示在word编辑器中_你最头疼pdf转word,这里有最全面的转换方法,让工作更轻松...
  4. 破烂微软的.NET IDE环境
  5. java中的foreach
  6. bigdicmal除法精度设置_BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题
  7. Jenkins的配置(rpm red hat方式)
  8. include virtual引入html文件,ASP文件引用include file和include virtual两种用法
  9. 【Linux】scp IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
  10. Linux 工程师的 6 类好习惯和 23 个教训
  11. Spring Framework,ioc容器(转)
  12. springmvc 使用
  13. python学期总结
  14. 董明珠与22岁的秘书孟羽童
  15. 天数换算月份_EXCEL如何算出指定的月份有多少天计算方法
  16. 随笔3:有调节的中介示例之 Model 1
  17. Day17:web前端开发面试题
  18. 项目 - 基于Docker Swarm的高可用Web集群
  19. ubuntu22.04图文安装流程
  20. 离散数学知识点总结(10)“关系” 知识的总结 <1>:关系的基础概念 —— 有序 n 元组,集合的笛卡尔积,集合的关系(二元关系)的定义,关系的集合运算, 关系的基本性质

热门文章

  1. Android Launcher负一屏实现方案
  2. 集合竞价如何买入_教你几招!什么是集合竞价?散户如何参与集合竞价?
  3. MacBook Pro 触摸板手势突然失效的解决方案
  4. python如何退出while循环_python如何跳出while循环
  5. Android群英传笔记——第七章:Android动画机制和使用技巧
  6. 【二〇二一·立春】读书笔记
  7. 11.HCNA-HNTD——文件系统基础
  8. HTML实例网页代码 简单的个人博客网站设计与实现 (div+css)
  9. 后盾网php项目开发实例,后盾网thinkphp许愿墙html源码
  10. 【高考往期真题】—— 2022高考数学全国 I 卷参考答案