Android 自定义密码键盘组件,支持多点触控

前言

现在对于前端APP的安全要求越来越高,所以很多APP都开发了自己的数字键盘,这么做对于安全性的提升个人总结有如下几点:

  1. 防止第三方键盘出现BUG,泄露用户支付密码。
  2. 自定义键盘可以根据自己的算法提高加密等级,比如的密码是123456,但是我可以在内存中存储为xxxxxx。
  3. Android 系统黑客只能获取点击屏幕位置,并不能直接获得该按钮的具体值。
  4. 可以自定义按键的点击效果,防止录屏获取支付密码。(用户体验不好)
  5. 可以每次点击更改按键位置,防止屏幕位置点击对比获取支付密码。(用户体验不好)

个人认为,如果不是安全要求很高的系统,满足上述前3点即可,毕竟用户体验也是很重要的。不过最好还是要根据实际具体情况分析。

密码键盘DEMO

Github地址:https://github.com/AdolphL/PayKeyboard

密码键盘DEMO解析

自定义键盘的技术点在于Canvas画图和点击事件的编写

画图

这个我就不多讲了,多看看API就可以了。键盘绘画主要逻辑在onDraw方法下,主要就是算每个按键的范围和按键不同状态的背景色不同体现点击效果,整体的刷新函数使用的是invalidate()并没有使用局部刷新,原因是使用invalidate(xx)好像在高版本Android设备上没有效果也就没有尝试了,感兴趣的同学可以了解下。

Android 自定义密码键盘组件,支持多点触控_第1张图片

点击事件

其实一个点击事件分解开来就是触点Down - xxx - Up(当然Up时候的区域要和Down时候的区域一致,不能中间状态已经出了此按键区域还触发OnClick时间了),这里可能还有个时间问题,过短就不触发,过长触发长按事件等等,此数字键盘的点击事件我是没有计算时间的,因为感觉意义不大。 

点击事件的主要代码在onTouch()方法下面,这里需要注意的是ACTION_DOWN事件必须返回true,系统才会把后续的Move和UP事件等继续交由此View处理, ACTION_POINTER_DOWN 和 ACTION_POINTER_UP 是支持多点触控的事件,我们可以使用event.getPointerId(event.getActionIndex()) 方法来获取是第几个触点出发的Down或者Up事件,当然Move事件也是支持多点的,但是在我的测试中好像只有第一个点响应了Up事件后才会触发第二个触点的Move事件。

Android 自定义密码键盘组件,支持多点触控_第2张图片

关于点击具体按键的区域判定,因为键盘上的按键都是我们自己画出来的,不是独立组件我们需要判定此次点击具体点击了哪个按键。clickable数组变量里面存放了每一个可点击按键的具体坐标。当触发onDown方法时会根据触点的坐标来求出此次触发了哪个按键或者是否触发按键。

Android 自定义密码键盘组件,支持多点触控_第3张图片

关于当前屏幕触点的状态全部存放在clickType变量中,因为我们要记录下触点Down时候的状态,在Up的时候才能判断是否触发Click事件。

安全

Android 自定义密码键盘组件,支持多点触控_第4张图片

这里可以注入一个Encryption接口,此接口复杂密码的加密(密码都是每一个字符加密的),具体加密算法由实现类实现。

密码键盘DEMO扩展

目前这个组件就是个小Demo,但是也可以做出很多的效果,比如结合popup做一个弹出键盘,或者结合透明的Activity让其它的应用直接唤醒你的支付键盘等。有兴趣的同学可以尝试下~

你可能感兴趣的:(Android)