Android 自定义View:手写签名

最近项目中有个新的需求,就是要实现用户手写签名,然后展示再上传到服务器。看到效果图后,先是面对百度编程搜了一下,很多实现方法,主要就是自定义View实现的,为了记录其中的坑,并提升自己的自定义View的能力,还是写出来记录一下。

主要代码如下(用的Kotlin写的):

import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileOutputStream
import java.io.IOException/*** Created by yuan7016 on 2019/07/02. <br/>* desc : 签名View*/
class SignView : View {/*** 画笔*/private var paint : Paint? = nullprivate var path : Path? = nullprivate lateinit var cacheCanvas : Canvas/*** 签名画布*/private lateinit var signBitmap: Bitmap//画笔颜色private var paintColor : Int = Color.BLACK//画笔宽度private var paintWidth  = 15fprivate var xAlixs : Float = 0.0fprivate var yAlixs : Float = 0.0f/*** 背景色(指最终签名结果文件的背景颜色,这里我设置为白色)*  你也可以设置为透明的*/private var mBackColor = Color.WHITE//是否已经签名private var isSigned : Boolean = falseconstructor(context: Context?) : super(context){init(context)}constructor(context: Context?,attributeSet: AttributeSet?) : super(context,attributeSet){init(context)}constructor(context: Context?,attributeSet: AttributeSet,defStyleAttr : Int) : super(context,attributeSet,defStyleAttr){init(context)}fun init(context: Context?){paint = Paint()path = Path()//setBackgroundColor(Color.WHITE)paint?.color = paintColor//设置签名颜色paint?.style = Paint.Style.STROKE  //设置填充样式paint?.isAntiAlias = true  //抗锯齿功能paint?.strokeWidth = paintWidth//设置画笔宽度}override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {super.onSizeChanged(w, h, oldw, oldh)//创建跟view一样大的bitmap,用来保存签名signBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)cacheCanvas = Canvas(signBitmap)cacheCanvas.drawColor(mBackColor)isSigned = false}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)//画此次笔画之前的签名canvas.drawBitmap(signBitmap, 0f, 0f, paint)// 通过画布绘制多点形成的图形canvas.drawPath(path,paint)}override fun onTouchEvent(event: MotionEvent): Boolean {//记录每次 X , Y轴的坐标xAlixs = event.xyAlixs = event.ywhen (event.action) {MotionEvent.ACTION_DOWN -> {path?.reset()path?.moveTo(xAlixs, yAlixs)}MotionEvent.ACTION_MOVE -> {path?.lineTo(xAlixs, yAlixs)isSigned = true}MotionEvent.ACTION_UP -> {//将路径画到bitmap中,即一次笔画完成才去更新bitmap,而手势轨迹是实时显示在画板上的。cacheCanvas.drawPath(path, paint)path?.reset()}else -> AppLog.e("otherwise")}// 更新绘制invalidate()return true}/*** 清除画板*/public fun clear(){isSigned = falsepath?.reset()paint?.color = paintColorcacheCanvas.drawColor(mBackColor, PorterDuff.Mode.CLEAR)invalidate()}/*** 保存画板** @param path       保存到路径*/@Throws(IOException::class)fun save(path: String) {val bitmap = signBitmap//  如果图片过大的话,需要压缩图片,不过在我测试手机上最大才50多kbval bos = ByteArrayOutputStream()bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos)val buffer = bos.toByteArray()if (buffer != null) {val file = File(path)if (file.exists()) {file.delete()}val outputStream = FileOutputStream(file)outputStream.write(buffer)outputStream.close()}}//TODO 这里可以扩展一些setter方法/*** 是否有签名** @return isSigned*/public fun getHasSigned() : Boolean{return isSigned}}

在布局中引用:

    <RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@id/ll_bottom"android:layout_marginBottom="15dp"android:background="@drawable/bg_shape_white_round_4"android:padding="10dp"><com.yuan.demo.view.SignViewandroid:id="@+id/signView"android:layout_width="match_parent"android:layout_height="match_parent" /><ImageViewandroid:id="@+id/ivBack"android:layout_width="30dp"android:layout_height="38dp"android:padding="8dp"android:background="?attr/selectableItemBackground"android:src="@mipmap/icon_back_gray" /></RelativeLayout>

在Activity中保存签名:

 /*** 保存签名*/private fun saveSignBitmap(){//保存路径val path : String = getExternalFilesDir(Environment.DIRECTORY_PICTURES).path + File.separator + "order_sign_" + System.currentTimeMillis() + ".png"if (signView.getHasSigned()){try {signView.save(path)ToastUtil.showToast("保存成功!")SharedPreferencesUtil.setPreferStr(AppConstant.KEY_SIGN_PATH,path)finish()}catch ( ex: Exception){ToastUtil.showToast("签名保存失败!")}}else{ToastUtil.showToast("您还没有签名,请签名!")}}

主要代码及逻辑如上所示。

效果图如下:

Android 自定义View手写签名相关推荐

  1. Android 将签名布局旋转90度,Android 自定义View手写签名

    Android 自定义View:手写签名 最近项目中有个新的需求,就是要实现用户手写签名,然后展示再上传到服务器.看到效果图后,先是面对百度编程搜了一下,很多实现方法,主要就是自定义View实现的,为 ...

  2. android 画布实现签名,Android 自定义View手写签名并保存图片

    1.自定义View--支撑设置画笔色彩,画笔宽度,画板色彩,铲除画板,查看是否有签名,保存画板图片(仿制粘贴可直接使用) /***CreatedbyYyyyQon2020/3/5. *电子签名*/pu ...

  3. Android 自定义View 手写瀑布流组件FlowLayout

    目录 FlowLayout实现关键步骤: 1.创建一个view继承自ViewGroup 2.重写并实现onMeasure方法 3.重写并实现onLayout方法 纸上得来终觉浅,绝知此事要躬行. 动手 ...

  4. java 手写签名_Android 自定义View手写签名并保存图片

    GIF压缩有问题,运行很顺滑!!! 1.自定义View--支持设置画笔颜色,画笔宽度,画板颜色,清除画板,检查是否有签名,保存画板图片(复制粘贴可直接使用) /*** Created by YyyyQ ...

  5. android 手写签批_Android自定义实现手写签名功能

    一.Android自定义View步骤 : 自定义属性: 选择和设置构造方法: 重写onMeasure()方法: 重写onDraw()方法: 重写onLayout()方法: 重写其他事件的方法(滑动监听 ...

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

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

  7. android 画布实现签名,Android实现屏幕手写签名

    Android屏幕手写签名的原理就是把手机屏幕当作画板,把用户手指当作画笔,手指在屏幕上在屏幕上划来划去,屏幕就会显示手指的移动轨迹,就像画笔在画板上写字一样.实现手写签名需要结合绘图的路径工具Pat ...

  8. android 手写签批_Android自定义View——手写签批

    接到一个领导批示保留原笔迹的功能,类似于绘画板,用户打开后可以绘制,点击完成后以图片的形式保存在本地,并且显示绘制后图片,上传服务器,达到保留原笔迹的目的.可以运用于签字.审批等. 效果图: 手写签批 ...

  9. 微信小程序自定义canvas手写签名组件

    需求如下图展示,因为小程序中有好几个地方使用签名,所以做成组件. 1.创建组件 signature.js const app = getApp(); Component({/*** 组件的属性列表*/ ...

最新文章

  1. Angular http跨域
  2. Windows上配置SSHKey到GItHub
  3. 数据结构06树和二叉树
  4. Physically Based Specular for Artists
  5. JAVA基础整理-6.Java数据类型
  6. 上传文件实时显示网速怎么实现_“双11”来了!三亚1487个5G基站带你拼网速_政务_澎湃新闻...
  7. 一起谈.NET技术,基于Visual Studio 2010 阐述C#4个特性
  8. Centos7 防火墙常用配置
  9. MyBatis sql查询字段问题
  10. 哨兵系列卫星介绍与下载教程
  11. 怎样手工清除autorun病毒
  12. 女朋友嘲笑我没有艺术气息,我不服!!一气之下我用python画素描人像
  13. 自然辩证法与计算机科学与技术,自然辩证法与计算机科学技术的研究.pdf
  14. 关于本人树莓派捣鼓过程中的一些记录
  15. skynet 游戏服务器探索(1)--熟悉skynet(网络)
  16. 2019公共课的【考研平均分】和难度系数公布!
  17. SLAM前端知识汇总
  18. java fock join 列子
  19. 产品经理不能做错的5件事
  20. ArcGIS中添加谷歌地图、天地图、高德地图、Bing...在线地图(附插件下载)

热门文章

  1. 宝剑锋从磨砺出,梅花开自苦寒来。今天那些在考研场上奋战的都是样的!
  2. sm是什么职位_职位简称
  3. 作为第一期iOS基础班学生,MJ广东开校之我见(原稿)
  4. 代理模式——B站动力节点
  5. 【Axure视频教程】制作真实下载效果
  6. 计算机导论课前演讲稿,课前三分钟演讲稿(精选6篇)
  7. 比特同步和帧同步的区别
  8. 深入浅出 - Android系统移植与平台开发(一)
  9. 与Flash Player斗智斗勇的全过程
  10. OTG--miniUSB的工作原理