最近说项目可能会用到一个电子签名,不需要识别的那种,只是一个单纯手写签名,然后以base64的格式提供给前端web页面。其实挺简单的,自定义一个手写view就上线了。Android 电子签名,手写签名案列实现方法!
先上图:

按钮说明:第一个按钮是清除手写板,第二个是将手写板的内容生成图片并压缩,第三个按钮是触发JS方法,在web页面中显。
布局说明:中间区域是手写屈,左上角是经过大小和质量压缩后的图片,右边是以base64格式上传web页面还原出来的图片。
代码说明:其实很简单,自定义CanvasView继承View
第一步:构造方法里面初始化画布背景、画笔、和路径

 public CanvasView(Context context, AttributeSet attrs) {super(context, attrs);setBackgroundColor(Color.WHITE);paint = new Paint();paint.setColor(Color.BLACK);paint.setStrokeWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, STROKE_WIDTH, getResources().getDisplayMetrics()));paint.setStyle(Paint.Style.STROKE);//设置画笔空心paint.setAntiAlias(true);//消除锯齿path = new Path();}

第二部:画笔归为

   @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawPath(path, paint);}

第三步:处理手势,触发画笔

    @Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:path.moveTo(x, y);break;case MotionEvent.ACTION_MOVE:path.lineTo(x, y);break;}invalidate();return true;}

到这里,手写功能就已经能使用了,接下来是做一些处理
1、将view生成图片

    //将view生生图片public Bitmap createBitmap (View v) {int w = v.getWidth();    int h = v.getHeight();//生成图片Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);    Canvas c = new Canvas(bmp);     c.drawColor(Color.WHITE); v.layout(0, 0, w, h);    v.draw(c);      return bmp;}

2、图片是否要旋转

    /*** 图片旋转* @param tmpBitmap* @param degrees* @return*/public static Bitmap rotateToDegrees(Bitmap tmpBitmap, float degrees) {Matrix matrix = new Matrix();matrix.reset();matrix.setRotate(degrees);Bitmap rBitmap = Bitmap.createBitmap(tmpBitmap, 0, 0, tmpBitmap.getWidth(), tmpBitmap.getHeight(), matrix,true);return rBitmap;}

3、图片按比例压缩

    /** * 图片按比例大小压缩方法 * * @param image (根据Bitmap图片压缩) * @return */  public static Bitmap compressScale(Bitmap image) {  ByteArrayOutputStream baos = new ByteArrayOutputStream();  image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  // 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出  if (baos.toByteArray().length / 1024 > 1024) {  baos.reset();// 重置baos即清空baos  image.compress(Bitmap.CompressFormat.JPEG, 80, baos);// 这里压缩50%,把压缩后的数据存放到baos中  }  ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  BitmapFactory.Options newOpts = new BitmapFactory.Options();  // 开始读入图片,此时把options.inJustDecodeBounds 设回true了  newOpts.inJustDecodeBounds = true;  Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  newOpts.inJustDecodeBounds = false;  int w = newOpts.outWidth;//原始宽高 int h = newOpts.outHeight;// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  (可根据原始高度计算)int be = 4;// be=1表示不缩放 ,缩放比为1/be ,这里缩小为原来的四分之一newOpts.inSampleSize = be; // 设置缩放比例  // newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565  // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  isBm = new ByteArrayInputStream(baos.toByteArray());  bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  return compressImage(bitmap,5);// 压缩好比例大小后再进行质量压缩  //        return bitmap;  } 

4、图片按照质量压缩

    /** * 质量压缩方法 * * @param image  size(kb)* @return */  public static Bitmap compressImage(Bitmap image,int size) {  ByteArrayOutputStream baos = new ByteArrayOutputStream();  image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  int options = 80;  while (baos.toByteArray().length / 1024 > size) { // 循环判断如果压缩后图片是否大于size,大于继续压缩  if(options<10) {options = 10;}baos.reset(); // 重置baos即清空baos  image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中  options -= 10;// 每次都减少10}  ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中  Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片  (PS,这一步操作后,图片质量会变大,没有搞懂为什么,知道的大神可以给我解释下549908016@qq.com)return bitmap;  }

5、将图片处理成base64的字符串

 /***   * 图片转化成base64字符串* 创建人:lxj  * 创建时间:2018年3月6日 上午10:14:02   * @version    **/public  String imageToBase64() {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理  String imgFile = Environment.getExternalStorageDirectory()+ "/" + imageName + ".jpg";//待处理的图片  InputStream in = null;  byte[] data = null;  //读取图片字节数组  try   {  in = new FileInputStream(imgFile);          data = new byte[in.available()];  in.read(data);  in.close();  }   catch (IOException e)   {  e.printStackTrace();  }  return Base64.encodeToString(data, Base64.DEFAULT); //返回Base64编码过的字节数组字符串  }  /** * 将Bitmap转换成Base64字符串 * @param bit * @return */  public String Bitmap2StrByBase64(Bitmap bit){  ByteArrayOutputStream bos=new ByteArrayOutputStream();  bit.compress(CompressFormat.JPEG, 100, bos);//参数100表示不压缩  byte[] bytes=bos.toByteArray();  return Base64.encodeToString(bytes, Base64.DEFAULT);  } 

demo下载地址,希望对大家有所帮助:http://download.csdn.net/download/u010886975/10271229

Android 电子签名,手写签名案列实现方法,并上传网页显示(base64)!相关推荐

  1. android 电子签名 手写签名 功能实现

    android 电子签名  手写签名 功能实现 这个手写的效果 就是一个 重写的的自定义的view  代码如下: package com.example.hand.views;import java. ...

  2. Android 电子签名/手写签名 保存到相册详解

    ps:因公司推崇线上信息办公化 设计到客户签名 将客户签好的名字上传到服务器 因此 写了一个demo 废话不多哔哔 上效果图: 这里我运用的是自定义view //权限<uses-permissi ...

  3. java实现手写签名,Android实现手写签名

    本文实例为大家分享了Android手写签名的实现方法,产品要求用户可以在app上签协议..所以得弄个手写签名版,参考了一些资料自己写了个PaintView去继承View,实现签名功能. package ...

  4. Android电子手写签名

    前言:最近一直在做h5,尼玛!!!前端真伤不起啊,由于刚接触,害怕兼容性啥的,导致我一个页面写了一天,泪崩啦-- 好吧,觉得得去撸一撸android才能平复的不安的小内心,刚好看到有一个这样的需求,需 ...

  5. 在app端手写签名并保存下来(以文件形式或者是base64编码)

    最近做的项目有个需求,在app端手写签名的并保存为文件或者base64编码.所以就刚好有时间写了一下并记录下来: 先上效果图: 分析思路:因为这里是要获取手势轨迹并画出来,所以肯定是有个Touch事件 ...

  6. flutter手写画板,保存存成图片并上传到后台服务器

    1.只是一个dome,供借鉴使用,待优化 图例: 2. 这个手写画板借鉴了很多的github上面的内容,基本就是用github上的内容拼凑出来的,随后我会把github上相关的链接写上去 3. 全部代 ...

  7. Android中手写签名的实现

    前言 本来这篇文章应该很早就发出来了,因为最近一直在忙项目,直到现在才发出来.本篇文章就是介绍如何在手机上进行签名. 设计思路 在画板上进行签名(其实就是绘制图片),裁剪图片,然后保存到本地相册. 效 ...

  8. Android屏幕手写签名的实现-详细篇

    老规矩先看一下效果图 [实现思路] (1)创建画笔 private void init(Context context) {this.mContext = context;//设置抗锯齿mGestur ...

  9. HTML5+jSignature插件手写签名生成图片并转换成文件流实现功能

    公司需求html5手写签名,并转换成图片上传服务器 项目结构:jquery+springboot项目需要引入js文件:jquery的jquery.min.js .jSignature插件的 jSign ...

最新文章

  1. 视频+课件|单目6D姿态估计算法详解
  2. 如何做一个听话的 “输入框”
  3. ubuntu查看python版本-切换Ubuntu默认python版本的两种方法
  4. 【Time系列三】简单的计时器(秒表)
  5. 来和小伙伴一起学习响应式网页设计吧
  6. php验证码 php中文网,ThinkPHP 使用不同风格及中文的验证码
  7. 小孩用计算机做作业怎么表达,计算机作业
  8. Learning-Python【0】:Windows环境下Python2和Python3的安装
  9. java 反编译 行号对齐 decompiler如何去掉行号
  10. Dkhadoop虚拟机安装操作演示教程
  11. CTRL-Space always toggles Chinese IME (Windows 7、10)
  12. 深度强化学习之A3C网络—理论及代码(小车上山)
  13. 2018年工商银行软件开发中心面试经历
  14. 日期格式化时候yyyy-MM-dd HH:mm:ss大小写区分
  15. 2020年最新PHP面试题汇总(附答案)
  16. Shell 编程三剑客
  17. 魔兽世界服务器的研究
  18. STM32开发基础知识——定时器
  19. L3-020 至多删三个字符 (30分)(动态规划)
  20. SAP物料主数据创建/修改(MM01/MM02),在 “分类” 页签 输入比较特殊的特征值,例如:希腊字母 “ μ ”,结果却显示 别的英文字符 (例如: “M“)的问题原因及解决方法

热门文章

  1. 双脚暗藏疾病信号 识足鸟脚型足压扫描仪帮你了解自己的脚
  2. Java实现窗体中角色逐渐风化效果
  3. 提升英语口语听力的软件
  4. vue-quill富文本编辑器插入img标签时自定义属性
  5. 华为错误报告存放路径_985应届硕士放弃实习转正机会,去华为、头条面试,结果蒙了...
  6. 大而全的ST的ARM芯片选型
  7. UI设计教程分享:字体变形—阴阳收缩法
  8. cryp:2:stream cipher
  9. 前端工程化与WebPack
  10. MCIeCAN系列miniPCIe接口CAN卡、PCI Express mini接口CAN卡、minipciecan介绍