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

/***CreatedbyYyyyQon2020/3/5.

*电子签名*/publicclassSignatureViewextendsView{privateContextcontext;//X轴起点privatefloatx;//Y轴起点privatefloaty;//画笔privatefinalPaintpaint=newPaint();//途径privatefinalPathpath=newPath();//画布privateCanvascanvas;//生成的图片privateBitmapbitmap;//画笔的宽度privateintpaintWidth=10;//签名色彩privateintpaintColor=Color.BLACK;//布景色彩privateintbackgroundColor=Color.WHITE;//是否现已签名privatebooleanisTouched=false;//签名开始与结束publicinterfaceTouch{voidOnTouch(booleanisTouch);

}privateTouchtouch;publicSignatureView(Contextcontext){super(context);

init(context);

}publicSignatureView(Contextcontext,@NullableAttributeSetattrs){super(context,attrs);

init(context);

}publicSignatureView(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAttr);

init(context);

}privatevoidinit(Contextcontext){this.context=context;//抗锯齿paint.setAntiAlias(true);//样式paint.setStyle(Paint.Style.STROKE);//画笔色彩paint.setColor(paintColor);//画笔宽度paint.setStrokeWidth(paintWidth);

}

@OverrideprotectedvoidonSizeChanged(intw,inth,intoldw,intoldh){super.onSizeChanged(w,h,oldw,oldh);//创建于view巨细一致的bitmapbitmap=Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888);

canvas=newCanvas(bitmap);

canvas.drawColor(backgroundColor);

isTouched=false;

}

@OverridepublicbooleanonTouchEvent(MotionEventevent){if(touch!=null)touch.OnTouch(true);switch(event.getAction()){//手指按下caseMotionEvent.ACTION_DOWN:

touchDwon(event);break;//手指移动caseMotionEvent.ACTION_MOVE:

isTouched=true;if(touch!=null)touch.OnTouch(false);

touchMove(event);break;//手指抬起caseMotionEvent.ACTION_UP:

canvas.drawPath(path,paint);

path.reset();break;

}//更新制作invalidate();returntrue;

}

@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);//画此次笔画之前的签名canvas.drawBitmap(bitmap,0,0,paint);//通过画布制作多点构成的图形canvas.drawPath(path,paint);

}//手指按下的办法privatevoidtouchDwon(MotionEventevent){//重置制作途径path.reset();floatdownX=event.getX();floatdownY=event.getY();

x=downX;

y=downY;//制作起点path.moveTo(downX,downY);

}//手指滑动的办法privatevoidtouchMove(MotionEventevent){//当前的x,y坐标点finalfloatmoveX=event.getX();finalfloatmoveY=event.getY();//之前的x,y坐标点finalfloatpreviousX=x;finalfloatpreviousY=y;//获取绝对值finalfloatdx=Math.abs(moveX-previousX);finalfloatdy=Math.abs(moveY-previousY);if(dx>=3||dy>=3){floatcX=(moveX+previousX)/2;floatcY=(moveY+previousY)/2;

path.quadTo(previousX,previousY,cX,cY);

x=moveX;

y=moveY;

}

}/***设置画笔色彩

*

*@parampaintColor*/publicvoidsetPaintColor(intpaintColor){this.paintColor=paintColor;

paint.setColor(paintColor);

}/***设置画笔宽度

*

*@parampaintWidth*/publicvoidsetPaintWidth(intpaintWidth){this.paintWidth=paintWidth;

paint.setStrokeWidth(paintWidth);

}/***设置画板色彩

*

*@paramcanvasColor*/publicvoidsetCanvasColor(intcanvasColor){this.backgroundColor=canvasColor;

}/***铲除画板*/publicvoidclear(){if(canvas!=null){

isTouched=false;//更新画板paint.setColor(paintColor);

paint.setStrokeWidth(paintWidth);

canvas.drawColor(backgroundColor,PorterDuff.Mode.CLEAR);

invalidate();

}

}/***获取画板的Bitmap

*

*@return*/publicBitmapgetBitmap(){

setDrawingCacheEnabled(true);

buildDrawingCache();

Bitmapbitmap=getDrawingCache();

setDrawingCacheEnabled(false);returnbitmap;

}/***是否有签名

*

*@return*/publicBooleangetSigstatus(){returnisTouched;

}/***保存画板

*

*@parampath保存到途径*/@SuppressLint(“WrongThread”)publicBooleansave(Stringpath)throwsIOException{

Bitmapbitmap=this.bitmap;

ByteArrayOutputStreambos=newByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.PNG,100,bos);byte[]buffer=bos.toByteArray();if(buffer!=null){

Filefile=newFile(path);if(file.exists()){

file.delete();

}

OutputStreamoutputStream=newFileOutputStream(file);

outputStream.write(buffer);

outputStream.close();returntrue;

}else{returnfalse;

}

}

}

2.xml布局引用自定义View(留意包名)

android:layout_width=”match_parent”android:layout_height=”match_parent”android:orientation=”vertical”>

android:id=”@+id/signature”android:layout_width=”match_parent”android:layout_height=”0dp”android:layout_weight=”1″android:background=”#fff”/>

android:layout_width=”match_parent”android:layout_height=”50dp”android:layout_margin=”20dp”android:orientation=”horizontal”>

android:id=”@+id/clear”android:layout_width=”0dp”android:layout_height=”match_parent”android:layout_weight=”1″android:gravity=”center”android:text=”铲除”/>

android:id=”@+id/isSignature”android:layout_width=”0dp”android:layout_height=”match_parent”android:layout_marginLeft=”10dp”android:layout_weight=”1″android:gravity=”center”android:text=”是否签名”/>

android:id=”@+id/save”android:layout_width=”0dp”android:layout_height=”match_parent”android:layout_marginLeft=”10dp”android:layout_weight=”1″android:gravity=”center”android:text=”保存”/>

3.Activity调用

/**

*CreatedbyYyyyQon2020/3/9.

*/

publicclassSignatureActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(@NullableBundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_signature);

SignatureViewsignatureView=findViewById(R.id.signature);

//设置画笔色彩(能够不设置–默许画笔宽度10,画笔色彩黑,布景色彩白)

signatureView.setPaintColor(Color.BLACK);

signatureView.setPaintWidth(20);

signatureView.setCanvasColor(Color.WHITE);

//铲除

Buttonclear=findViewById(R.id.clear);

clear.setOnClickListener(view->{

signatureView.clear();

//设置画笔色彩(能够不设置–默许画笔宽度10,画笔色彩黑,布景色彩白)

signatureView.setPaintColor(Color.BLACK);

signatureView.setPaintWidth(20);

signatureView.setCanvasColor(Color.WHITE);

});

//是否含有签名

ButtonisSignature=findViewById(R.id.isSignature);

isSignature.setOnClickListener(view->{

if(signatureView.getSigstatus()){

Toast.makeText(SignatureActivity.this,”有签名”,Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(SignatureActivity.this,”无签名”,Toast.LENGTH_SHORT).show();

}

});

//保存

Buttonsave=findViewById(R.id.save);

save.setOnClickListener(view->{

try{

if(signatureView.save(“/sdcard/YyyyQ.png”)){

Toast.makeText(SignatureActivity.this,”保存成功”,Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(SignatureActivity.this,”保存失败”,Toast.LENGTH_SHORT).show();

}

}catch(IOExceptione){

e.printStackTrace();

}

});

}

}

android 画布实现签名,Android 自定义View手写签名并保存图片相关推荐

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

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

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

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

  3. Android 自定义View手写签名

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

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

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

  5. 在钉钉上怎么手写_数码知识:钉钉手写签名如何设置开启手写签名教程

    如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多小技巧的,这些技巧很多小伙伴一般都是不知道如何来实用的,就好比最近就有很多小伙伴们想要知道钉钉手写签名如何设置开启手写签名教程, ...

  6. Android中通过自定义签名控件实现手写签名

    场景 实现手写签名并获取签名照片 注: 博客: BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_CSDN博客-C#,SpringBoot,架构之路领域博主 关注公众号 霸道的程序猿 获取编 ...

  7. 微信 html5 识别手写签名,html5 canvas做手写签名,该如何解决

    html5 canvas做手写签名 我用HTML5做了一个手写签名,运行在手机浏览器上,但是画出来效果总是很粗糙,曲线不够平滑,想找大侠指教 HTML> PhoneGap 浏览器不支持canva ...

  8. html5 移动端手写签名,H5移动端项目实现手写签名功能 vue实现手写签名

    vue 移动端实现手写签名效果,功能很完美,保存时保存为base64格式. 刚好项目用到此功能,就网上找了一下,清理了无用代码,简单方便,因为项目中多个地方需要使用,所以我将它整理为组件,通过ref和 ...

  9. 微信小程序 手写签名_小程序手写签名(wepy)

    对于手写签名组件组件晚上有很多种写法,我选择了一种进行了wepy的框架的改造.如果使用wepy框架做手写签名的话可以直接复制下面的代码. 这里需要提醒的是:安卓手机和苹果手机有适配性的问题,苹果手机在 ...

最新文章

  1. 思科安全:加密流量威胁检测、加密流量威胁和恶意软件检测、识别无线干扰或威胁、Talos 情报源可加强对已知和新型威胁的防御、分布式安全异常检测...
  2. java最长回文子序列_LeetCode[5] - 最长回文子串动态规划
  3. 紧迫感:在危机中变革
  4. 当AV1视频编解码器来到Webex!
  5. Asp导出到Excel之二
  6. mysql去重取最大值,逻辑类似oracle的over(partition by)函数
  7. 回顾一下Unix哲学
  8. 机器学习——第一回视频总结
  9. 计算化侦查之根据公交卡记录抓小偷
  10. 使用paddlepaddle 进行人脸识别
  11. C语言随机数的生成【详解】
  12. Mac无法写入移动硬盘 这些软件帮你解决
  13. 设n是一个任意自然数,如果n的各位数字反向排列所得的自然数与n相等,则n称为回文数。从键盘输入一个5位数字,请编写程序判断这个数字是不是回文数
  14. simulink模块名称显示设置_simulink模块名称继承
  15. Android 9.0 蓝牙扫描流程
  16. 中鑫吉鼎|不同薪资上班族理财应该如何规划
  17. 深度学习中模型训练效果不好的原因以及防止过拟合的方法
  18. 【Android实现点击回到顶部】
  19. 写一篇关于《红楼梦》的论文,比较推荐的角度或者选题有哪些?
  20. 计算机工程与应用退修后退稿,《计算机工程与应用》退修意见 - 论文投稿 - 小木虫 - 学术 科研 互动社区...

热门文章

  1. 从两个bug来看Javascript的装载
  2. 行业深度见解•SD-WAN对于企业云的重要性
  3. 网络广告投放四大技巧有哪些?怎么样投放效果最好?
  4. ​一个文科妹子走上前端开发不归路(干货分享)
  5. 《数据虚拟化:商务智能系统的数据架构与管理》一 1.11 数据集成的其他方式...
  6. 在 Chrome 开发者工具中调试 node.js
  7. javascript中apply、call和bind的区别
  8. eclipse: Program g++ not found in PATH
  9. KMP算法的详细解释及实现
  10. 浏览器不是最大化的时候要考虑浏览器的边框宽度