Android仿支付宝手势密码解锁原理及源码
2015-03-30 11:29:30  By: dwtedx

一个手势解锁的Demo、初步实现了Android手势解锁的功能、Demo是一个仿支付宝手势密码部分的源码、项目在1280×720分辨率上显示有问题、如果要集成到自己的项目、得自己修改正一下问题、在 854x480上没有问题、项目编码UTF-8默认编译版本4、4、2、希望对大家有用

android 手势密码实现


实现思路:

1、要用一个类来表示这9个点中的第一个点。里面保留有当前点的上下左右的各个位置等属性

2、自定义GroupView、用来装9个点、9个点的显示是通过ImageView。复写onLayout这个方法、让点按需求排列

3、定义一个可以画线的View、复写onTouchEvent方法、在这个方法里面进行画直线的操作

4、判断用户手指当前的位置、取出当前的位置去与那9个点中的每个点的位置进行比较、如果用户点的位置在某一个点之内、那么当那个点置换背景图片


触摸事件处理代码

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:

        mov_x = (int) event.getX();
        mov_y = (int) event.getY();

        // 判断当前点击的位置是处于哪个点之内
        currentPoint = getPointAt(mov_x, mov_y);
        if (currentPoint != null) {
            currentPoint.setHighLighted(true);
            passWordSb.append(currentPoint.getNum());
        }
        // canvas.drawPoint(mov_x, mov_y, paint);// 画点
        invalidate();
        break;
    case MotionEvent.ACTION_MOVE:
        clearScreenAndDrawList();

        // 得到当前移动位置是处于哪个点内
        Point pointAt = getPointAt((int) event.getX(), 
            (int) event.getY());
        //代表当前用户手指处于点与点之前
        if(currentPoint==null && pointAt == null){
            return true;
        }else{//代表用户的手指移动到了点上
            if(currentPoint == null){//先判断当前的point是不是为null
                //如果为空,那么把手指移动到的点赋值给currentPoint
                currentPoint = pointAt;
                //把currentPoint这个点设置选中为true;
                currentPoint.setHighLighted(true);
                passWordSb.append(currentPoint.getNum());
            }
        }
        
        if (pointAt == null || currentPoint.equals(pointAt)
                || pointAt.isHighLighted()) {
            // 点击移动区域不在圆的区域 或者
            // 如果当前点击的点与当前移动到的点的位置相同
            // 那么以当前的点中心为起点,以手指移动位置为终点画线
            canvas.drawLine(currentPoint.getCenterX(),
                    currentPoint.getCenterY(), event.getX(), 
                    event.getY(), paint);// 画线
            
            

        } else {
            // 如果当前点击的点与当前移动到的点的位置不同
            // 那么以前前点的中心为起点,以手移动到的点的位置画线
            canvas.drawLine(currentPoint.getCenterX(),
                    currentPoint.getCenterY(), pointAt.getCenterX(),
                    pointAt.getCenterY(), paint);// 画线

            pointAt.setHighLighted(true);
            
            Pair<Point, Point> pair = new Pair<Point, Point>(
                currentPoint, pointAt);
            lineList.add(pair);

            // 赋值当前的point;
            currentPoint = pointAt;
            passWordSb.append(currentPoint.getNum());
        }
        invalidate();
        break;
    case MotionEvent.ACTION_UP:// 当手指抬起的时候
        // 清掉屏幕上所有的线,只画上集合里面保存的线
        if(passWord.equals(passWordSb.toString())){
            //代表用户绘制的密码手势与传入的密码相同
            callBack.checkedSuccess();
        }else{
            //用户绘制的密码与传入的密码不同。
            callBack.checkedFail();
        }
        //重置passWordSb
        passWordSb = new StringBuilder();
        //清空保存点的集合
        lineList.clear();
        //重新绘制界面
        clearScreenAndDrawList();
        for (Point p : list) {
            p.setHighLighted(false);
        }
        invalidate();
        break;
    default:
        break;
    }
    return true;
}


源代码下载链接: http://dwtedx.com/download.html?bdkey=s/1gdncON5 密码: i8uy

本Demo有好像有一点小bug、如果不满足你的需求、你可以去看看Android九宫格图案解锁

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


猜你喜欢的

快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+