随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
现如今,手势密码功能已是司空见惯,市面上也出现许多优秀的开源项目,让广大开发者更方便更快捷的集成此功能,这里在git上找了一个来试试,用起来还挺不错的,使用起来也比较简单,链接地址如下:
https://github.com/autume/GestureLock
先大概介绍下该项目支持哪些功能:
- 支持手势密码的绘制,并支持密码保存功能,解锁时自动比对密码给出结果
- 封装了绘制密码的方法,比对两次密码是否一致,可以快捷地进行手势密码的设置
- 可以设置密码输入错误后的重试次数上限
- 可以自定义不同状态下手势密码图案的颜色
- 可以自定义手势密码的触摸点数量(n*n)
上一个效果图瞧一瞧
现在大概知道我们要实现哪些功能了,下面分享下使用方法和步骤
首先我们要在自己的工程里面引用该项目库
如果是as工程,在工程的 build.gradle中加入:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
module的build.gradle中加入依赖:
dependencies {
compile 'com.github.autume:GestureLock:1.0.0'
}
如果是eclipse工程,需要把原库项目转换为eclipse的library工程,然后自己的项目引用就行了。
当然也可以把原库项目代码和资源复制到自己的项目,只有几个类,代码量也不多。
引用好后,就可以开始写代码了,首先在自己的布局文件里面引用
<com.syd.oden.gesturelock.view.GestureLockViewGroup
android:id="@+id/gesturelockview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:preference_id="1"
android:layout_marginTop="30dp"
app:count="3" />
这里有几个自定义属性,在库项目的attr.xml配置中可以看到,说明如下
color_no_finger:未触摸时圆形的颜色
color_finger_on:触摸时圆形的颜色
color_finger_up_correct:输入正确时圆形的颜色
color_finger_up_error:出错时圆形的颜色
count:手势密码的圆形数量,n*n
preference_id:手势密码保存的id号,不输入或输入-1则使用默认的id
配置好布局文件我们已经可以看到手势图效果了,然后我们需要在代码里面加一些逻辑
首先要在oncreate初始化控件,这个是最基本的
private void initView() {
gestureLockViewGroup = (GestureLockViewGroup) findViewById(R.id.gesturelockview);
tv_state = (TextView) findViewById(R.id.tv_state);
layout_reset = (RelativeLayout) findViewById(R.id.layout_reset);
layout_reset.setOnClickListener(this);
}
状态提示框自己定义位置,一般在手势图上面,清除密码按钮是为了方便测试,具体使用场景根据自己项目需求定
然后就是初始化手势了,有四个步骤
private void initGesture() {
setGestureWhenNoSetPassword();
setGesturePasswordSettingListener();
setGestureEventListener();
setGestureRetryLimitListener();
}
1、设置主页面提示ui,当还没有设置过密码的时候,主页面需改为提示绘制手势密码
/**
* xml布局文件默认解锁页面,当密码未设置时重置为设置密码的页面
*/
private void setGestureWhenNoSetPassword() {
if (!gestureLockViewGroup.isSetPassword()) {
tv_state.setTextColor(Color.WHITE);
tv_state.setText("绘制手势密码");
}
}
2、注入设置密码监听器
private void setGesturePasswordSettingListener() {
gestureLockViewGroup.setGesturePasswordSettingListener(new GesturePasswordSettingListener() {
@Override
public boolean onFirstInputComplete(int len) {
if (len > 3) {
tv_state.setTextColor(Color.WHITE);
tv_state.setText("再次绘制手势密码");
return true;
}
tv_state.setTextColor(Color.RED);
tv_state.setText("最少连接4个点,请重新输入!");
return false;
}
@Override
public void onSuccess() {
tv_state.setTextColor(Color.WHITE);
Toast.makeText(MainActivity.this, "密码设置成功!", Toast.LENGTH_SHORT).show();
tv_state.setText("请输入手势密码解锁!");
}
@Override
public void onFail() {
tv_state.setTextColor(Color.RED);
tv_state.setText("与上一次绘制不一致,请重新绘制");
}
});
}
这是设置密码的监听器回调, 第一次设置完会进行回调,进行业务判断后,会进行第二次设置,两次匹配成功表示手势设置成功,否则会回调失败,几个方法一目了然。设置好密码后就可以使用手势检测了。
3、设置手势检测监听器
private void setGestureEventListener() {
gestureLockViewGroup.setGestureEventListener(new GestureEventListener() {
@Override
public void onGestureEvent(boolean matched) {
if (!matched) {
tv_state.setTextColor(Color.RED);
tv_state.setText("手势密码错误");
HandlerUtil.postDelayedRunnOnUI(new Runnable() {
@Override
public void run() {
gestureLockViewGroup.resetView();
}
}, 1000);
} else {
// 重置检测
if (isReset) {
isReset = false;
Toast.makeText(MainActivity.this, "清除成功!", Toast.LENGTH_SHORT).show();
resetGesturePattern();
} else {// 匹配检测
tv_state.setTextColor(Color.WHITE);
tv_state.setText("手势密码正确");
}
}
}
});
}
这个是检测手势是否匹配的监听器回调,如果不匹配自己页面的提示文字状态作相应修改,原框架检测不匹配后会一直保留红色,我观察大部分手势密码器都会红一下,然后恢复之前的颜色,所以我这里加了一个延迟1秒恢复,当然这个功能也可以直接集成到手势库项目中,使用起来更方便。
如果手势匹配成功,分为两种情况,一是清除密码的时候需要验证一下原密码,所以这个分支执行的逻辑是清除原密码,逻辑在resetGesturePattern方法里面,二是正常的检测,通过后一般在项目中就可以跳转页面了,这里只做个提示表示个意思。
重置密码方法:
/**
* 重置密码和UI页面
*/
private void resetGesturePattern() {
gestureLockViewGroup.removePassword();
setGestureWhenNoSetPassword();
gestureLockViewGroup.resetView();
}
几个作用,移除文件里面缓存的密码,主页面提示恢复检测的状态,手势重置
4、设置错误次数控制监听器
为了安全性,一般会设置总共可以输错几次,这个大家都懂的
/**
* 设置手势错误重试次数监听器
*/
private void setGestureRetryLimitListener() {
gestureLockViewGroup.setGestureUnmatchedExceedListener(3, new GestureUnmatchedExceedListener() {
@Override
public void onUnmatchedExceedBoundary() {
tv_state.setTextColor(Color.RED);
tv_state.setText("错误次数过多,请稍后再试!");
}
});
}
通过这几步,已经可以把手势整个流程跑起来了,梳理一下关键环节,首先要设置手势密码,用户要进行两次绘制匹配,然后就是每次登陆app等时候进行手势检测,关键逻辑就在那两个监听器里面,其它的都是一些辅助作用。
该开源库还提供了一些其它API方便大家更灵活的使用
public void removePassword() :清除密码
public void savePassword() : 保存密码,设置手势密码成功后会自动保存,也可以调用该接口另外设置密码
public void getPassword(): 获取密码
public void setRetryTimes(int retryTimes) : 设置重试次数上限
public boolean isSetPassword() : 返回现在是否已经设置有密码
public void resetView() : 将视图Reset
对源码有兴趣的可以在前面git地址去下载项目源码,也不复杂。
这里附一个本测试demo的项目源码,方便大家运行调试。
有什么问题欢迎留言,也可以关注公众号、加技术交流群等