Android简易手势密码开源库

来源:互联网 发布:云计算优缺点 编辑:程序博客网 时间:2024/04/30 17:33

本文介绍一个Android手势密码开源库的使用及实现的详细过程,该开源库主要实现以下几个功能:
- 支持手势密码的绘制,并支持密码保存功能,解锁时自动比对密码给出结果
- 封装了绘制密码的方法,比对两次密码是否一致,可以快捷地进行手势密码的设置
- 可以设置密码输入错误后的重试次数上限
- 可以自定义不同状态下手势密码图案的颜色
- 可以自定义手势密码的触摸点数量(n*n)

最近需要用到手势密码解锁功能,找了一些demo感觉用起来都有点麻烦,于是参考一些文章自己造了下轮子,封装了相关的一些方法,使用起来比较便捷。
github链接如下,觉得还可以请帮忙star支持下~
github链接 https://github.com/autume/GestureLock
个人博客 http://blog.csdn.net/yaodong379

使用效果

首先看下使用效果:

使用方法

XML布局文件中使用该控件

<code class="language-java hljs  has-numbering"> <com.syd.oden.gesturelock.view.GestureLockViewGroup        android:id=<span class="hljs-string">"@+id/gesturelock"</span>        android:layout_width=<span class="hljs-string">"match_parent"</span>        android:layout_height=<span class="hljs-string">"match_parent"</span>        app:preference_id=<span class="hljs-string">"1"</span>        android:layout_marginTop=<span class="hljs-string">"30dp"</span>        app:count=<span class="hljs-string">"3"</span> /></code>

可以设置的一些参数,说明如下:
color_no_finger:未触摸时圆形的颜色
color_finger_on:触摸时圆形的颜色
color_finger_up_correct:输入正确时圆形的颜色
color_finger_up_error:出错时圆形的颜色
count:收拾密码的圆形数量,n*n
preference_id:手势密码保存的id号,不输入或输入-1则使用默认的id

初始化

<code class="language-java hljs  has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initGesture</span>() {        mGestureLockViewGroup = (GestureLockViewGroup) findViewById(R.id.gesturelock);        gestureEventListener();        gesturePasswordSettingListener();        gestureRetryLimitListener();    }</code>

设置手势密码监听事件

<code class="language-java hljs  has-numbering"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">gestureEventListener</span>() {        mGestureLockViewGroup.setGestureEventListener(<span class="hljs-keyword">new</span> GestureEventListener() {            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onGestureEvent</span>(<span class="hljs-keyword">boolean</span> matched) {                mylog.d(<span class="hljs-string">"onGestureEvent matched: "</span> + matched);                <span class="hljs-keyword">if</span> (!matched) {                    tv_state.setTextColor(Color.RED);                    tv_state.setText(<span class="hljs-string">"手势密码错误"</span>);                } <span class="hljs-keyword">else</span> {                    <span class="hljs-keyword">if</span> (isReset) {                        isReset = <span class="hljs-keyword">false</span>;                        Toast.makeText(MainActivity.<span class="hljs-keyword">this</span>, <span class="hljs-string">"清除成功!"</span>, Toast.LENGTH_SHORT).show();                        resetGesturePattern();                    } <span class="hljs-keyword">else</span> {                        tv_state.setTextColor(Color.WHITE);                        tv_state.setText(<span class="hljs-string">"手势密码正确"</span>);                    }                }            }        });    }</code>

若已经设置有密码则会进入该回调,在这里对结果进行处理,上面的例子中加入了一个重设密码的处理。

手势密码设置

<code class="language-java hljs  has-numbering"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">gesturePasswordSettingListener</span>() {        mGestureLockViewGroup.setGesturePasswordSettingListener(<span class="hljs-keyword">new</span> GesturePasswordSettingListener() {            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onFirstInputComplete</span>(<span class="hljs-keyword">int</span> len) {                <span class="hljs-keyword">if</span> (len > <span class="hljs-number">3</span>) {                    tv_state.setTextColor(Color.WHITE);                    tv_state.setText(<span class="hljs-string">"再次绘制手势密码"</span>);                    <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;                } <span class="hljs-keyword">else</span> {                    tv_state.setTextColor(Color.RED);                    tv_state.setText(<span class="hljs-string">"最少连接4个点,请重新输入!"</span>);                    <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;                }            }            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onSuccess</span>() {                tv_state.setTextColor(Color.WHITE);                Toast.makeText(MainActivity.<span class="hljs-keyword">this</span>, <span class="hljs-string">"密码设置成功!"</span>, Toast.LENGTH_SHORT).show();                tv_state.setText(<span class="hljs-string">"请输入手势密码解锁!"</span>);            }            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onFail</span>() {                tv_state.setTextColor(Color.RED);                tv_state.setText(<span class="hljs-string">"与上一次绘制不一致,请重新绘制"</span>);            }        });    }</code>

若还未设置密码,绘制手势的时候会进入该回调,返回值为绘制的触摸点的数量,onFirstInputComplete中返回true则进入第二手势密码的绘制,两次输入一致后自动保存密码。

重试次数超过限制监听

<code class="language-java hljs  has-numbering"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">gestureRetryLimitListener</span>() {        mGestureLockViewGroup.setGestureUnmatchedExceedListener(<span class="hljs-number">3</span>, <span class="hljs-keyword">new</span> GestureUnmatchedExceedListener() {            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onUnmatchedExceedBoundary</span>() {                tv_state.setTextColor(Color.RED);                tv_state.setText(<span class="hljs-string">"错误次数过多,请稍后再试!"</span>);            }        });    }</code>

若设置了该监听事件,则输入错误有次数限制,超过上限后进入回调,在该回调中进行处理。

清除密码的逻辑自己加个判断处理下即可,具体可以看下github上的demo

其他的一些API

public void removePassword() :清除密码
public void savePassword() : 保存密码,设置手势密码成功后会自动保存,也可以调用该接口另外设置密码
public void getPassword(): 获取密码
public void setRetryTimes(int retryTimes) : 设置重试次数上限
public boolean isSetPassword() : 返回现在是否已经设置有密码
public void resetView() : 将视图Reset

在项目中导入该库

仅需加入两行代码:
在工程的 build.gradle中加入:

<code class="language-java hljs  has-numbering">allprojects {        repositories {            ...            maven { url <span class="hljs-string">"https://jitpack.io"</span> }        }    }</code>

module的build.gradle中加入依赖:

<code class="language-java hljs  has-numbering">dependencies {            compile <span class="hljs-string">'com.github.autume:GestureLock:1.0.0'</span>    }</code>

总的使用就是这样,是不是很简单!

具体实现过程

下面讲下实现的过程,如果只是直接拿来用的话也可以略过这部分。

自定义手势密码的圆形view

这部分主要参考Hongyang大大的博客,稍微修改了一下

初始化传入参数

<code class="language-java hljs  has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-title">GestureLockView</span>(Context context, <span class="hljs-keyword">int</span> colorNoFingerr, <span class="hljs-keyword">int</span> colorFingerOn, <span class="hljs-keyword">int</span> colorCorrect, <span class="hljs-keyword">int</span> colorError) {        <span class="hljs-keyword">super</span>(context);        <span class="hljs-keyword">this</span>.mColorNoFinger = colorNoFingerr;        <span class="hljs-keyword">this</span>.mColorFingerOn = colorFingerOn;        <span class="hljs-keyword">this</span>.mColorFingerUpCorrect = colorCorrect;        <span class="hljs-keyword">this</span>.mColorFingerUpError = colorError;        mPaint = <span class="hljs-keyword">new</span> Paint(Paint.ANTI_ALIAS_FLAG);        mArrowPath = <span class="hljs-keyword">new</span> Path();    }</code>

根据不同的触摸状态绘制不同颜色的圆

<code class="language-java hljs  has-numbering"> <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDraw</span>(Canvas canvas) {        <span class="hljs-keyword">switch</span> (mCurrentStatus) {            <span class="hljs-keyword">case</span> STATUS_FINGER_ON:                <span class="hljs-comment">// 绘制外圆</span>                mPaint.setStyle(Style.STROKE);                mPaint.setColor(mColorFingerOn);                mPaint.setStrokeWidth(<span class="hljs-number">2</span>);                canvas.drawCircle(mCenterX, mCenterY, mRadius, mPaint);                <span class="hljs-comment">// 绘制内圆</span>                mPaint.setStyle(Style.FILL);                canvas.drawCircle(mCenterX, mCenterY, mRadius * mInnerCircleRadiusRate, mPaint);                <span class="hljs-keyword">break</span>;            <span class="hljs-keyword">case</span> STATUS_FINGER_UP:                <span class="hljs-comment">// 绘制外圆</span>                <span class="hljs-keyword">if</span> (GestureLockViewGroup.isCorrect)                    mPaint.setColor(mColorFingerUpCorrect);                <span class="hljs-keyword">else</span>                    mPaint.setColor(mColorFingerUpError);                mPaint.setStyle(Style.STROKE);                mPaint.setStrokeWidth(<span class="hljs-number">2</span>);                canvas.drawCircle(mCenterX, mCenterY, mRadius, mPaint);                <span class="hljs-comment">// 绘制内圆</span>                mPaint.setStyle(Style.FILL);                canvas.drawCircle(mCenterX, mCenterY, mRadius * mInnerCircleRadiusRate, mPaint);                drawArrow(canvas);                <span class="hljs-keyword">break</span>;            <span class="hljs-keyword">case</span> STATUS_NO_FINGER:                <span class="hljs-comment">// 绘制外圆</span>                mPaint.setStyle(Style.STROKE);                mPaint.setColor(mColorNoFinger);                canvas.drawCircle(mCenterX, mCenterY, mRadius, mPaint);                <span class="hljs-comment">// 绘制内圆</span>                mPaint.setStyle(Style.FILL);                mPaint.setColor(mColorNoFinger);                canvas.drawCircle(mCenterX, mCenterY, mRadius * mInnerCircleRadiusRate, mPaint);                <span class="hljs-keyword">break</span>;        }    }</code>

绘制箭头

<code class="language-java hljs  has-numbering"> <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onMeasure</span>(<span class="hljs-keyword">int</span> widthMeasureSpec, <span class="hljs-keyword">int</span> heightMeasureSpec) {        <span class="hljs-keyword">super</span>.onMeasure(widthMeasureSpec, heightMeasureSpec);        mWidth = MeasureSpec.getSize(widthMeasureSpec);        mHeight = MeasureSpec.getSize(heightMeasureSpec);        <span class="hljs-comment">// 取长和宽中的小值</span>        mWidth = mWidth < mHeight ? mWidth : mHeight;        mRadius = mCenterX = mCenterY = mWidth / <span class="hljs-number">2</span>;        mRadius -= mStrokeWidth / <span class="hljs-number">2</span>;        <span class="hljs-comment">// 绘制三角形,初始时是个默认箭头朝上的一个等腰三角形,用户绘制结束后,根据由两个GestureLockView决定需要旋转多少度</span>        <span class="hljs-keyword">float</span> mArrowLength = mWidth / <span class="hljs-number">2</span> * mArrowRate;        mArrowPath.moveTo(mWidth / <span class="hljs-number">2</span>, mStrokeWidth + <span class="hljs-number">2</span>);        mArrowPath.lineTo(mWidth / <span class="hljs-number">2</span> - mArrowLength, mStrokeWidth + <span class="hljs-number">2</span> + mArrowLength);        mArrowPath.lineTo(mWidth / <span class="hljs-number">2</span> + mArrowLength, mStrokeWidth + <span class="hljs-number">2</span> + mArrowLength);        mArrowPath.close();        mArrowPath.setFillType(Path.FillType.WINDING);    } <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">drawArrow</span>(Canvas canvas) {        <span class="hljs-keyword">if</span> (mArrowDegree != -<span class="hljs-number">1</span>) {            mPaint.setStyle(Paint.Style.FILL);            canvas.save();            canvas.rotate(mArrowDegree, mCenterX, mCenterY);            canvas.drawPath(mArrowPath, mPaint);            canvas.restore();        }    }</code>

自定义手势密码的ViewGroup

加入自定义view的属性

<code class="language-java hljs  has-numbering"><?xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"utf-8"</span>?><resources>    <attr name=<span class="hljs-string">"color_no_finger"</span> format=<span class="hljs-string">"color"</span> />    <attr name=<span class="hljs-string">"color_finger_on"</span> format=<span class="hljs-string">"color"</span> />    <attr name=<span class="hljs-string">"color_finger_up_correct"</span> format=<span class="hljs-string">"color"</span> />    <attr name=<span class="hljs-string">"color_finger_up_error"</span> format=<span class="hljs-string">"color"</span> />    <attr name=<span class="hljs-string">"count"</span> format=<span class="hljs-string">"integer"</span> />    <attr name=<span class="hljs-string">"preference_id"</span> format=<span class="hljs-string">"integer"</span> />    <declare-styleable name=<span class="hljs-string">"GestureLockViewGroup"</span>>        <attr name=<span class="hljs-string">"color_no_finger"</span> />        <attr name=<span class="hljs-string">"color_finger_on"</span> />        <attr name=<span class="hljs-string">"color_finger_up_correct"</span> />        <attr name=<span class="hljs-string">"color_finger_up_error"</span> />        <attr name=<span class="hljs-string">"count"</span> />        <attr name=<span class="hljs-string">"preference_id"</span> />    </declare-styleable></resources></code>

获取参数及初始化

<code class="language-java hljs  has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-title">GestureLockViewGroup</span>(Context context, AttributeSet attrs,                                <span class="hljs-keyword">int</span> defStyle) {        <span class="hljs-keyword">super</span>(context, attrs, defStyle);        <span class="hljs-javadoc">/**         * 获得所有自定义的参数的值         */</span>        TypedArray a = context.obtainStyledAttributes(attrs,                R.styleable.GestureLockViewGroup, defStyle, <span class="hljs-number">0</span>);        mNoFingerColor = a.getColor(R.styleable.GestureLockViewGroup_color_no_finger, mNoFingerColor);        mFingerOnColor = a.getColor(R.styleable.GestureLockViewGroup_color_finger_on, mFingerOnColor);        mFingerUpColorCorrect = a.getColor(R.styleable.GestureLockViewGroup_color_finger_up_correct, mFingerUpColorCorrect);        mFingerUpColorError = a.getColor(R.styleable.GestureLockViewGroup_color_finger_up_error, mFingerUpColorError);        mCount = a.getInt(R.styleable.GestureLockViewGroup_count, mCount);        mPrferenceId = a.getInt(R.styleable.GestureLockViewGroup_preference_id, mPrferenceId);        a.recycle();        <span class="hljs-javadoc">/**         * 获取密码状态         */</span>        gesturePreference = <span class="hljs-keyword">new</span> GesturePreference(context, mPrferenceId);        password = gesturePreference.ReadStringPreference();        Log.d(TAG, <span class="hljs-string">"password now is : "</span> + password);        isSetPassword = !password.equals(<span class="hljs-string">"null"</span>); <span class="hljs-comment">//判断是否已经保存有密码</span>        isInPasswordSettingMode = !isSetPassword;     <span class="hljs-comment">//当未设置密码,进入密码设置模式</span>        <span class="hljs-comment">// 初始化画笔</span>        mPaint = <span class="hljs-keyword">new</span> Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setStyle(Paint.Style.STROKE);        mPaint.setStrokeCap(Paint.Cap.ROUND);        mPaint.setStrokeJoin(Paint.Join.ROUND);        mPath = <span class="hljs-keyword">new</span> Path();    }</code>

在触摸监听中处理不同事件

<code class="language-java hljs  has-numbering"> <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onTouchEvent</span>(MotionEvent event) {        <span class="hljs-keyword">int</span> action = event.getAction();        <span class="hljs-keyword">int</span> x = (<span class="hljs-keyword">int</span>) event.getX();        <span class="hljs-keyword">int</span> y = (<span class="hljs-keyword">int</span>) event.getY();        Log.d(TAG, <span class="hljs-string">"mTryTimes : "</span> + mTryTimes);        <span class="hljs-comment">//重试次数超过限制,直接返回</span>        <span class="hljs-keyword">if</span> (mTryTimes <= <span class="hljs-number">0</span> && isRetryTimeLimit) {             <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;        }        <span class="hljs-keyword">switch</span> (action) {            <span class="hljs-keyword">case</span> MotionEvent.ACTION_DOWN:                reset();     <span class="hljs-comment">// 重置</span>                <span class="hljs-keyword">break</span>;            <span class="hljs-keyword">case</span> MotionEvent.ACTION_MOVE:                drawAndGetSelectedWhenTouchMove(x, y);                <span class="hljs-keyword">break</span>;            <span class="hljs-keyword">case</span> MotionEvent.ACTION_UP:                <span class="hljs-keyword">if</span> (isInPasswordSettingMode) {                    <span class="hljs-keyword">if</span> (gesturePasswordSettingListener != <span class="hljs-keyword">null</span>)                        setPasswordHandle();  <span class="hljs-comment">//设置密码</span>                } <span class="hljs-keyword">else</span> {                    <span class="hljs-keyword">if</span> (mChoose.size() > <span class="hljs-number">0</span>) {                        isCorrect = checkAnswer();                    } <span class="hljs-keyword">else</span> {                        <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;                    }                    <span class="hljs-keyword">if</span> (gestureEventListener != <span class="hljs-keyword">null</span>) {                        gestureEventListener.onGestureEvent(isCorrect);  <span class="hljs-comment">//将结果回调</span>                    }                    <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.mTryTimes == <span class="hljs-number">0</span>) {                        gestureUnmatchedExceedListener.onUnmatchedExceedBoundary();  <span class="hljs-comment">//超出重试次数,进入回调</span>                    }                }                drawWhenTouchUp();                <span class="hljs-keyword">break</span>;        }        invalidate();        <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;    } <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">drawAndGetSelectedWhenTouchMove</span>(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y) {        mPaint.setColor(mFingerOnColor);        mPaint.setAlpha(<span class="hljs-number">50</span>);        GestureLockView child = getChildIdByPos(x, y);        <span class="hljs-keyword">if</span> (child != <span class="hljs-keyword">null</span>) {            <span class="hljs-keyword">int</span> cId = child.getId();            <span class="hljs-keyword">if</span> (!mChoose.contains(cId)) {                mChoose.add(cId);                mChooseString = mChooseString + cId;                child.setMode(Mode.STATUS_FINGER_ON);                <span class="hljs-comment">// 设置指引线的起点</span>                mLastPathX = child.getLeft() / <span class="hljs-number">2</span> + child.getRight() / <span class="hljs-number">2</span>;                mLastPathY = child.getTop() / <span class="hljs-number">2</span> + child.getBottom() / <span class="hljs-number">2</span>;                <span class="hljs-keyword">if</span> (mChoose.size() == <span class="hljs-number">1</span>)<span class="hljs-comment">// 当前添加为第一个</span>                {                    mPath.moveTo(mLastPathX, mLastPathY);                } <span class="hljs-keyword">else</span>                <span class="hljs-comment">// 非第一个,将两者使用线连上</span>                {                    mPath.lineTo(mLastPathX, mLastPathY);                }            }        }        <span class="hljs-comment">// 指引线的终点</span>        mTmpTarget.x = x;        mTmpTarget.y = y;    }    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">drawWhenTouchUp</span>() {        <span class="hljs-keyword">if</span> (isCorrect) {            mPaint.setColor(mFingerUpColorCorrect);        } <span class="hljs-keyword">else</span> {            mPaint.setColor(mFingerUpColorError);        }        mPaint.setAlpha(<span class="hljs-number">50</span>);        Log.d(TAG, <span class="hljs-string">"mChoose = "</span> + mChoose);        <span class="hljs-comment">// 将终点设置位置为起点,即取消指引线</span>        mTmpTarget.x = mLastPathX;        mTmpTarget.y = mLastPathY;        <span class="hljs-comment">// 改变子元素的状态为UP</span>        setItemModeUp();        <span class="hljs-comment">// 计算每个元素中箭头需要旋转的角度</span>        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i + <span class="hljs-number">1</span> < mChoose.size(); i++) {            <span class="hljs-keyword">int</span> childId = mChoose.get(i);            <span class="hljs-keyword">int</span> nextChildId = mChoose.get(i + <span class="hljs-number">1</span>);            GestureLockView startChild = (GestureLockView) findViewById(childId);            GestureLockView nextChild = (GestureLockView) findViewById(nextChildId);            <span class="hljs-keyword">int</span> dx = nextChild.getLeft() - startChild.getLeft();            <span class="hljs-keyword">int</span> dy = nextChild.getTop() - startChild.getTop();            <span class="hljs-comment">// 计算角度</span>            <span class="hljs-keyword">int</span> angle = (<span class="hljs-keyword">int</span>) Math.toDegrees(Math.atan2(dy, dx)) + <span class="hljs-number">90</span>;            startChild.setArrowDegree(angle);        }    }</code>

设置密码处理:

<code class="language-java hljs  has-numbering">    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setPasswordHandle</span>() {        <span class="hljs-keyword">if</span> (isWaitForFirstInput) {            <span class="hljs-keyword">if</span> (gesturePasswordSettingListener.onFirstInputComplete(mChooseString.length())) {                firstInputPassword = mChooseString;                isWaitForFirstInput = <span class="hljs-keyword">false</span>;            }        } <span class="hljs-keyword">else</span> {            <span class="hljs-keyword">if</span> (firstInputPassword.equals(mChooseString)) {                gesturePasswordSettingListener.onSuccess();                savePassword(mChooseString);                isInPasswordSettingMode = <span class="hljs-keyword">false</span>;            } <span class="hljs-keyword">else</span> {                gesturePasswordSettingListener.onFail();            }        }        reset();    }</code>

检查手势密码是否正确:

<code class="language-java hljs  has-numbering">    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">checkAnswer</span>() {        <span class="hljs-keyword">if</span> (password.equals(mChooseString)) {            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;        } <span class="hljs-keyword">else</span> {            <span class="hljs-keyword">if</span> (isRetryTimeLimit)                <span class="hljs-keyword">this</span>.mTryTimes--;            <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;        }    }</code>

重置:

<code class="language-java hljs  has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">reset</span>() {        mChoose.clear();        mChooseString = <span class="hljs-string">""</span>;        mPath.reset();        <span class="hljs-keyword">for</span> (GestureLockView gestureLockView : mGestureLockViews) {            gestureLockView.setMode(Mode.STATUS_NO_FINGER);            gestureLockView.setArrowDegree(-<span class="hljs-number">1</span>);        }    }</code>

对外公开的一些方法

<code class="language-java hljs  has-numbering">    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setGestureEventListener</span>(GestureEventListener gestureEventListener) {        <span class="hljs-keyword">this</span>.gestureEventListener = gestureEventListener;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setGestureUnmatchedExceedListener</span>(<span class="hljs-keyword">int</span> retryTimes, GestureUnmatchedExceedListener gestureUnmatchedExceedListener) {        isRetryTimeLimit = <span class="hljs-keyword">true</span>;        <span class="hljs-keyword">this</span>.mTryTimes = retryTimes;        <span class="hljs-keyword">this</span>.gestureUnmatchedExceedListener = gestureUnmatchedExceedListener;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setGesturePasswordSettingListener</span>(GesturePasswordSettingListener gesturePasswordSettingListener) {        <span class="hljs-keyword">this</span>.gesturePasswordSettingListener = gesturePasswordSettingListener;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">removePassword</span>() {        gesturePreference.WriteStringPreference(<span class="hljs-string">"null"</span>);        <span class="hljs-keyword">this</span>.isSetPassword = <span class="hljs-keyword">false</span>;        isWaitForFirstInput = <span class="hljs-keyword">true</span>;        isInPasswordSettingMode = <span class="hljs-keyword">true</span>;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">savePassword</span>(String password) {        <span class="hljs-keyword">this</span>.password = password;        gesturePreference.WriteStringPreference(password);    }    <span class="hljs-keyword">public</span> String <span class="hljs-title">getPassword</span>() {        <span class="hljs-keyword">return</span> password;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">resetView</span>() {        reset();        invalidate();    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setRetryTimes</span>(<span class="hljs-keyword">int</span> retryTimes) {        <span class="hljs-keyword">this</span>.mTryTimes = retryTimes;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isSetPassword</span>() {        <span class="hljs-keyword">return</span> isSetPassword;    }</code>

定义密码存储的Preference

就是简单的存和读

<code class="language-java hljs  has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-title">GesturePreference</span>(Context context, <span class="hljs-keyword">int</span> nameTableId) {        <span class="hljs-keyword">this</span>.context = context;        <span class="hljs-keyword">if</span> (nameTableId != -<span class="hljs-number">1</span>)            <span class="hljs-keyword">this</span>.nameTable = nameTable + nameTableId;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">WriteStringPreference</span>(String data) {        SharedPreferences preferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);        SharedPreferences.Editor editor = preferences.edit();        editor.putString(nameTable, data);        editor.commit();    }    <span class="hljs-keyword">public</span> String <span class="hljs-title">ReadStringPreference</span>() {        SharedPreferences preferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);        <span class="hljs-keyword">return</span> preferences.getString(nameTable, <span class="hljs-string">"null"</span>);    }</code>

总结

ok,至此,整个手势密码的实现就完成了。

本文首发地址:http://www.codeceo.com/article/android-gusture-lock.html


0 0