最近做了电子签名的需求,其实就是绘制图片,下面给出所做的样式

自定义view,采用画笔绘制一张图片,保存到本地。接下来说一下主要的方法有清除,保存,获取路径等。

 /*** 清空签名*/public void clear() {if (mCanvas != null) {isTouched = false;mPaint.setColor(mPenColor);mCanvas.drawColor(mBackColor, PorterDuff.Mode.CLEAR);mPaint.setColor(mPenColor);invalidate();}}/*** 保存图片* @param path 保存的地址* @param clearBlank 是否清除空白区域* @param blank 空白区域留空距离*/public void save(String path, boolean clearBlank, int blank) throws IOException {if (TextUtils.isEmpty(path)) {return;}mSavePath = path;Bitmap bitmap = cacheBitmap;if (clearBlank) {bitmap = clearBlank(bitmap, blank);}ByteArrayOutputStream bos = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);byte[] buffer = bos.toByteArray();if (buffer != null) {File file = new File(path);if (file.exists()) {file.delete();}OutputStream os = new FileOutputStream(file);os.write(buffer);os.close();bos.close();}}/*** 获取Bitmap缓存*/public Bitmap getBitmap() {setDrawingCacheEnabled(true);buildDrawingCache();Bitmap bitmap = getDrawingCache();setDrawingCacheEnabled(false);return bitmap;}/*** 获取保存路径*/public String getSavePath() {return mSavePath;}/*** 逐行扫描,清除边界空白*/private Bitmap clearBlank(Bitmap bmp, int blank) {int height = bmp.getHeight();int width = bmp.getWidth();int top = 0, left = 0, right = 0, bottom = 0;int[] pixs = new int[width];boolean isStop;//扫描上边距不等于背景颜色的第一个点for (int i = 0; i < height; i++) {bmp.getPixels(pixs, 0, width, 0, i, width, 1);isStop = false;for (int pix :pixs) {if (pix != mBackColor) {top = i;isStop = true;break;}}if (isStop) {break;}}//扫描下边距不等于背景颜色的第一个点for (int i = height - 1; i >= 0; i--) {bmp.getPixels(pixs, 0, width, 0, i, width, 1);isStop = false;for (int pix :pixs) {if (pix != mBackColor) {bottom = i;isStop = true;break;}}if (isStop) {break;}}pixs = new int[height];//扫描左边距不等于背景颜色的第一个点for (int x = 0; x < width; x++) {bmp.getPixels(pixs, 0, 1, x, 0, 1, height);isStop = false;for (int pix : pixs) {if (pix != mBackColor) {left = x;isStop = true;break;}}if (isStop) {break;}}//扫描右边距不等于背景颜色的第一个点for (int x = width - 1; x > 0; x--) {bmp.getPixels(pixs, 0, 1, x, 0, 1, height);isStop = false;for (int pix : pixs) {if (pix != mBackColor) {right = x;isStop = true;break;}}if (isStop) {break;}}if (blank < 0) {blank = 0;}//计算加上保留空白距离之后的图像大小left = left - blank > 0 ? left - blank : 0;top = top - blank > 0 ? top - blank : 0;right = right + blank > width - 1 ? width - 1 : right + blank;bottom = bottom + blank > height - 1 ? height - 1 : bottom + blank;return Bitmap.createBitmap(bmp, left, top, right - left, bottom - top);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);cacheBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);mCanvas = new Canvas(cacheBitmap);mCanvas.drawColor(mBackColor);isTouched = false;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawBitmap(cacheBitmap, 0, 0, mPaint);canvas.drawPath(mPath, mPaint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mPenX = event.getX();mPenY = event.getY();mPath.moveTo(mPenX, mPenY);return true;case MotionEvent.ACTION_MOVE:isTouched = true;float x = event.getX();float y = event.getY();float preX = mPenX;float preY = mPenY;float dx = Math.abs(x - preX);float dy = Math.abs(y - preY);if (dx >= 3 || dy >= 3) {float cx = (x + preX) / 2;float cy = (y + preY) / 2;mPath.quadTo(preX, preY, cx, cy);mPenX = x;mPenY = y;}invalidate();break;case MotionEvent.ACTION_UP:mCanvas.drawPath(mPath, mPaint);mPath.reset();break;default:break;}return super.onTouchEvent(event);}

完整的demo请下载 https://download.csdn.net/download/lou_liang/12043935,希望对有需要的同学提供帮助。

Android手绘电子签名相关推荐

  1. android 手绘地图,发现一款新App:「Pott」能一键制作你的手绘足迹地图,爱旅行的你别错过...

    旅行回来,照片发过朋友圈,就躺在了永不见天日的电脑里.整理出来,用 Pott打卡去过的地方,你会惊讶的发现,竟然已经去过那么多地方了. Pott是一款设计独特,内容丰富的地图打卡和分享社区.你可以记录 ...

  2. Android手绘效果实现

    效果图 原理 大概介绍一下实现原理.首先你得有一张图(废话~),接下来就是把这张图的轮廓提取出来,轮廓提取算法有很多,本人不是搞图像处理的,对图像处理感兴趣的童鞋可以查看相关资料.如果你有好的轮廓提取 ...

  3. Android手绘涂鸦PaintView

    推荐一款很好用的涂鸦自定义控件PaintView https://github.com/duoduoyoumaicai/PaintView PaintView 一个很好用的绘图板 可以绘制曲线.橡皮擦 ...

  4. 自定义View进阶-手绘地图(二)

    前一篇说到了使用自定义ViewGroup实现手绘地图,没看过的可以移步,因为本篇会用到上一篇的部分内容 自定义View-手绘地图(一) 和前一篇一样,实现图片的操作经过同样的操作.onMeasure, ...

  5. UWP 手绘视频创作工具技术分享系列 - 有 AI 的手绘视频

    原文: UWP 手绘视频创作工具技术分享系列 - 有 AI 的手绘视频 AI(Artificial Intelligence)正在不断的改变着各个行业的形态和人们的生活方式,图像识别.语音识别.自然语 ...

  6. 这是你从未见过的组件库 -- Android 上的手绘风格组件

    之前看到一位作者开源了一款手绘风格的图表库 Chart.xkcd,感觉很是喜欢. 当然仅仅图表是满足不了我滴,于是想看看 Android 上是否有类似的开源库,一番搜索之后,颗粒无收. 想想原理可能不 ...

  7. Android基于mAppWidget实现手绘地图(一)--简介

    http://lemberg.github.io/mappwidget/user_guide.html 最近在看一些导游类应用,发现一些景区的导览图使用的完全是自定义地图,也就是手绘地图.这种小范围使 ...

  8. Android通过Canvas手绘一个折线图

    简述 Android绘制图表,有强大的 MPAndroidChart,适合图表功能需求大的应用.至于如下图一个简单的展示作用的折线图还是可以自己封装手绘一个的 这个就是要实现的最终效果 定义的Styl ...

  9. android 照片变油画,美图秀秀Android v1.5.3增油画 打造梵高式手绘作品

    美图秀秀Android继上个版本更新了艺术特效分类,素描和彩铅都受到了用户的热捧,大家忙着将自己的照片变身绘画作品,体验一回文艺青年的范儿.而此次美图团队在v1.5.3中新增"油画" ...

最新文章

  1. [Z]谷歌(Google)算法面试题
  2. auto make System.map to C header file
  3. 2018 前端面试题(不定期更新)
  4. 微信小程序获取openid
  5. 使用可视化工具redisclient连接redis
  6. linuxsed替换字符串后保存_Numpy运用-文件读写、存储及字符串处理
  7. 设计者模式详解--桥接模式
  8. 接口自动化测试框架搭建(10、运行特定测试case,生成报告发送邮件)--python+HTMLTestRunnerCN+request+unittest+mock+db
  9. 计算机名ip自动配置文件,[已解决]批处理如何根据网卡MAC地址自动设置IP和计算机名?...
  10. linux运行raxml,在线和本地两种方法构建 RAxML 进化树方法和解读
  11. 没英语基础怎么自学html5,没有一点英语基础怎么自学
  12. FER 人脸情绪识别系统
  13. 域名转向目录php代码,php域名301转向程序代码
  14. 高等数学(三) 极限
  15. 忘记teamviewer密码怎么办?
  16. 堆的c语言实现以及简单应用
  17. webview ERR_UNKNOWN_URL_SCHEME
  18. Android Factory Images for Nexus Devices
  19. 第一次写“辅助”软件(微信游戏跳一跳)
  20. Eclipse将项目部署tomcat的webapps目录

热门文章

  1. jacob 文件类型转换
  2. 工具教程第二十一讲:比特儿交易平台APP的使用(一)
  3. 安科瑞高精度开口电流互感器的规格(安科瑞-卓宋兰)
  4. 安装插件iClean pro, 期间与 pp助手冲突
  5. 想入手抖音定制生日祝福短视频,没有创意思路怎么办?几个方面带你了解整个流程
  6. 图像特征之颜色直方图
  7. IDE集成开发环境介绍与安装
  8. Mon的Python基础入门
  9. 响应response.setHeader方法
  10. 微信为何折戟美国市场