随着无纸化的推进,在Android手机或其它设备往往需要用户进行手动签名,进行授权等操作。例如有银行用嵌入定制设备代替以后纸质的业务办理,以及在APP上作为替代用户对“同意《...协议》”的单选框打勾(√)的操作等。其后续操作往往是将签名图片与协议信息进行合成,保存,作为凭证。
个人认为目前其优点是,逼格高了一点,签名具有一定的独特性;缺点主要是当用手指在手机上签名时,由于屏幕尺寸和写字的方式等原因,写出字,往往自己都不敢恭维,不知道这样的签字是否具有法律效应。
抛开其优缺点,在技术上,实现签名并截屏需要用的知识点还是挺多的,帮助技能的提升和完善,可也用到其它很多地方,比如涂鸦,交互,分享等。
电子签名源自github一款流畅的电子签名——android-signaturepad。感谢作者的无私奉献,android-signaturepad功能十分强大,可以选择签名字体颜色,背景色,可生成PNG和SVG等格式图片。
由于项目的需要,去掉了SVG部分,设置签名粗细一致,生成透明PNG格式,方便签名在协议信息界面的显示。(当然也可将签名背景色设置与协议信息界面一致,当初怎么就没想到呢,还在透明设置上纠结了好久,脑子不够用呀)。其中相关的代码位置如下:
//笔触最细
private final int DEFAULT_ATTR_PEN_MIN_WIDTH_PX = 3;
//笔触最粗,因需粗细一致故设置与最细等值
//private final int DEFAULT_ATTR_PEN_MAX_WIDTH_PX = 7;
private final int DEFAULT_ATTR_PEN_MAX_WIDTH_PX = 3;
//笔触颜色
private final int DEFAULT_ATTR_PEN_COLOR = Color.BLACK;
以上是针对SignaturePad这个自定义控件的设置,在Activity中调用时作者也有写好的方法供直接使用,无需自己对Bitmap进行操作。具体如下:
//生成透明图片,则调用此方法,得到Bitmap
public Bitmap getTransparentSignatureBitmap(boolean trimBlankSpace);
//否则调用,缺省白色背景
public Bitmap getSignatureBitmap() ;
//下面这个方法中直接传入Bitmap,生成图片文件,并更新图库;
//若不更新图库,虽然图片能成功生成但在图库中看不到,只有等手机重启后才会显示(我的大神F1,4.4.2,不知道高版本的系统是否也这样)。
//图片保存成功返回true,否则返回false。成功时取文件的路径,传回协议信息进行展示
private boolean addTransPngSignatureToGallery(Bitmap signature);
//发送广播,使媒体库进行扫描更新的方法
private void scanMediaFile(File photo);
以上是实现签名的过程,在回传图片路径后,信息展示界面即可将其展示在协议之下,等待用户点击确定。点击确定,APP则进行截屏,将包换协议信息和签名的布局截屏为另一图片,上传至服务器或者分享等等。其中,截屏是针对ScrollView,因为有时协议信息太长导致信息和签名未显示在可视区域。方法如下:
private void PrintScreen() {
int height = 0;
for (int i = 0; i < scrollView.getChildCount(); i++) {
height += scrollView.getChildAt(i).getHeight();
scrollView.getChildAt(i).setBackgroundResource(android.R.color.white);
}
Bitmap bitmap = Bitmap.createBitmap(scrollView.getWidth(), height, Bitmap.Config.RGB_565);
File photo = new File(getAlbumStorageDir("Info"), String.format("Sign_%d.png", System.currentTimeMillis()));
signature_path = photo.getAbsolutePath();
Canvas canvas = new Canvas(bitmap);
scrollView.draw(canvas);
OutputStream stream;
try {
stream = new FileOutputStream(photo);
bitmap.compress(Bitmap.CompressFormat.JPEG, 20, stream);
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
签名并截图的过程大概就是这样。主要还是SignaturePad这个项目十分给力,源码也十分规范,值得一读。先简单记录一下,待补充效果图。也欢迎大家一起交流探讨。