android三分钟快速集成手势密码功能

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(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的项目源码,方便大家运行调试。

手势密码检测器-Android代码类资源-CSDN下载

有什么问题欢迎留言,也可以关注公众号、加技术交流群等

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u010142437

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值