Android 之简易涂鸦板
没有废话,简单粗暴。
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 之简易涂鸦板相关推荐
- android 简易涂鸦板,canvas实现的简易涂鸦板效果
用canvas实现的简易涂鸦板效果,用鼠标点击在画布上随意涂鸦 涂鸦 *{ margin: 0; padding: 0; } #canvas1{ box-shadow: 0 5px 40px blac ...
- Canvas制作简易涂鸦板
使用canvas可以做到许多意想不到的功能,尤其动画方面,这次在vue项目中使用canvas制作一个简易涂鸦板 1. html部分代码 <template><div id=" ...
- HTML5实例教程——简易涂鸦板-何韬-专题视频课程
HTML5实例教程--简易涂鸦板-6858人已学习 课程介绍 用CANVES制作一个涂鸦板,让初学者初步了解HTML5的语言与功能. 课程收益 快速学会涂鸦板的做法,同时对HT ...
- Android应用开发实例篇(1)-----简易涂鸦板
一.概述 这次要做一个简单的涂鸦板应用,以前在Qt上实现过,突然想到要把它在Android上实现,呵呵,既简单又有趣. 二.实现 新建工程MyWall,修改/res/layout/main.xml文件 ...
- UI进阶--Quartz2D和触摸事件的简单使用:简易涂鸦板
需求:实现一个简易的涂鸦板应用,使用鼠标在涂鸦板内拖动即可进行涂鸦,点击保存按钮,可以把完成的涂鸦保存,点击回退按钮可以向后退回一步,点击清空可以让涂鸦板清空. 实现步骤: 1.布局storyboar ...
- Android小程序-涂鸦板
最近android课老师布置了一个课后作业,是实现android涂鸦板的功能, 然后自己写了一个简单的涂鸦板,可以实现选择颜色.尺寸.清屏的功能. 首先是效果图: 主要是使用Canvas和Paint来 ...
- CGContextRef 实现简易涂鸦板
写代码之前,先说一下涂鸦,涂鸦是指漫无目的地乱写乱画.今天我们不管乱写,因为乱写只需要一个textview.下面说说如何实现乱画的功能. 说的是一个日本人想要切腹,那他得先找把刀,最次也要弄把改锥来, ...
- HTML5简易涂鸦板制作
运行效果 代码中主要要学会阅读英文单词,务必认真学习English 代码清单1 <!DOCTYPE html> <html><head><meta chars ...
- ActionsScript 3.0简易涂鸦板
使用的编辑器是FlashDevelop(汉化版) 需要注意的是,该例子使用到了Button (属于flash cs3/cs4 中fl组件,位于fl.controls包下,而此编辑器默认不包含fl包) ...
- android中留言板功能,js 实现简易留言板功能
无标题文档 li{list-style:none;} li{position:relative;width:500px;} a{position:absolute;right:10px;} var c ...
最新文章
- 比较2个DataTable中的内容是否相同的方法
- 使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
- blob显示在word编辑器中_你最头疼pdf转word,这里有最全面的转换方法,让工作更轻松...
- 破烂微软的.NET IDE环境
- java中的foreach
- bigdicmal除法精度设置_BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题
- Jenkins的配置(rpm red hat方式)
- include virtual引入html文件,ASP文件引用include file和include virtual两种用法
- 【Linux】scp IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
- Linux 工程师的 6 类好习惯和 23 个教训
- Spring Framework,ioc容器(转)
- springmvc 使用
- python学期总结
- 董明珠与22岁的秘书孟羽童
- 天数换算月份_EXCEL如何算出指定的月份有多少天计算方法
- 随笔3:有调节的中介示例之 Model 1
- Day17:web前端开发面试题
- 项目 - 基于Docker Swarm的高可用Web集群
- ubuntu22.04图文安装流程
- 离散数学知识点总结(10)“关系” 知识的总结 <1>:关系的基础概念 —— 有序 n 元组,集合的笛卡尔积,集合的关系(二元关系)的定义,关系的集合运算, 关系的基本性质
热门文章
- Android Launcher负一屏实现方案
- 集合竞价如何买入_教你几招!什么是集合竞价?散户如何参与集合竞价?
- MacBook Pro 触摸板手势突然失效的解决方案
- python如何退出while循环_python如何跳出while循环
- Android群英传笔记——第七章:Android动画机制和使用技巧
- 【二〇二一·立春】读书笔记
- 11.HCNA-HNTD——文件系统基础
- HTML实例网页代码 简单的个人博客网站设计与实现 (div+css)
- 后盾网php项目开发实例,后盾网thinkphp许愿墙html源码
- 【高考往期真题】—— 2022高考数学全国 I 卷参考答案