自定义View——画板
今天实现的是画板效果
实现原理
根据触摸事件返回的坐标点绘制path路径
@Override public boolean onTouchEvent(MotionEvent event) { x = event.getX(); y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //当触摸屏幕的时候将点移动到触摸的位置 path.moveTo(x, y); break; case MotionEvent.ACTION_MOVE: //当滑动的时候将滑动路径连接起来 path.lineTo(x, y); //在滑动的过程中不断更新界面 invalidate(); break; case MotionEvent.ACTION_UP: //当手抬起的时候更新界面 invalidate(); break; } return true; }
canvas绘制路径
//绘制白色背景 canvas.drawColor(Color.WHITE); //绘制路径 canvas.drawPath(path, paint);
最后保存自己绘制的图像
public void save() { setDrawingCacheEnabled(false); setDrawingCacheEnabled(true); new Thread(new Runnable() { @Override public void run() { Bitmap drawingCache = getDrawingCache(true); File file = new File(getContext().getCacheDir() + "123.png"); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(file); drawingCache.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream); fileOutputStream.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); try { MediaStore.Images.Media.insertImage(getContext().getContentResolver(), file.getAbsolutePath(), "sad.png", null); } catch (FileNotFoundException e) { e.printStackTrace(); } // 最后通知图库更新 getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getPath()))); Log.e("测试", "保存成功"); } catch (IOException e) { e.printStackTrace(); } } } } }).start(); }
完整代码
package com.yuyigufen.customview; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.net.Uri; import android.provider.MediaStore; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Random; /** * Created by Administrator on 2018/6/11 0011. */ public class MyPaintView extends View { private float x; private float y; private Path path; private Paint paint; private Random random; public MyPaintView(Context context) { super(context); } public MyPaintView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } private void init() { random = new Random(); paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(10); paint.setColor(Color.RED); path = new Path(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(measureSize(widthMeasureSpec), measureSize(heightMeasureSpec)); } private int measureSize(int size) { int mode = MeasureSpec.getMode(size); int s = MeasureSpec.getSize(size); if (mode == MeasureSpec.EXACTLY) { return s; } else if (mode == MeasureSpec.AT_MOST) { return Math.min(s, 200); } else { return 200; } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.WHITE); canvas.drawPath(path, paint); } @Override public boolean onTouchEvent(MotionEvent event) { x = event.getX(); y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path.moveTo(x, y); break; case MotionEvent.ACTION_MOVE: path.lineTo(x, y); invalidate(); break; case MotionEvent.ACTION_UP: invalidate(); break; } return true; } public void clear() { path.reset(); invalidate(); } public void save() { setDrawingCacheEnabled(false); setDrawingCacheEnabled(true); new Thread(new Runnable() { @Override public void run() { Bitmap drawingCache = getDrawingCache(true); File file = new File(getContext().getCacheDir() + "123.png"); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(file); drawingCache.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream); fileOutputStream.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); try { MediaStore.Images.Media.insertImage(getContext().getContentResolver(), file.getAbsolutePath(), "sad.png", null); } catch (FileNotFoundException e) { e.printStackTrace(); } // 最后通知图库更新 getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getPath()))); Log.e("测试", "保存成功"); } catch (IOException e) { e.printStackTrace(); } } } } }).start(); } }
个人博客https://myml666.github.io

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
phpMyAdmin 4.7.x CSRF 漏洞利用
phpMyAdmin是个知名MySQL/MariaDB在线管理工具,phpMyAdmin团队在4.7.7版本中修复了一个危害严重的CSRF漏洞(PMASA-2017-9),攻击者可以通过诱导管理员访问恶意页面,悄无声息地执行任意SQL语句。 该篇文章我们将结合VulnSpy的在线phpMyAdmin环境来熟悉该漏洞的利用。 在线 phpMyAdmin CSRF 演练地址:https://www.vulnspy.com/?u=pmasa-2017-9 注:重启演示靶机即可重置靶机 1 在线创建 phpMyAdmin 环境 点击 VulnSpy 提供的创建靶机地址(https://www.vsplate.com/?github=vulnspy/PMASA-2017-9) 跳转到 VSPlate 后,直接点击GO按钮,便会自动创建一个 phpMyAdmin 环境 打开演示地址的链接,我们的 phpMyAdmin 就创建完成了。 使用帐号 root ,密码 toor ,登录 phpMyAdmin 。根据页面信息,我们可以发现当前 phpMyAdmin 的版本为 4.7.6,刚好匹配存在漏洞的 ...
- 下一篇
解决eclipse为什么不能查看源码
Java eclipse中查看源代码ctrl+左键单击 一、你是第一次使用该功能,没有导入项目源码,故无法查看源码 解决方法: 1.点 “window“-> “Preferences”-> “Java” -> “Installed JRES”; 2.此时"Installed JRES"右边是列表窗格,列出了系统中的JRE 环境,选择你的JRE,然后点边上的“Edit...“, 会出现一个窗口(Edit JRE) ; 3.选中rt.jar文件的这一项:“C:\Program Files\Java\jre1.8.0_91\jre\lib\rt.jar” 点 左边的“+”号展开它(JDK实际安装路径以你的为准); 4.展开后,可以看到“Source Attachment:(none)”,点这一项,点右边的按钮“Source Attachment...“,选择你的JDK目录下的 “src.zip”文件; 5.一路点“ok”结束。 二、之前可以通过ctrl + shift + t找对应的类,但是后来无法通过ctrl + shift + t找对应的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7安装Docker,走上虚拟化容器引擎之路