Android仿支付宝手势密码解锁原理及源码
2015-03-30 11:29:30 By: shinyuu
一个手势解锁的Demo、初步实现了Android手势解锁的功能、Demo是一个仿支付宝手势密码部分的源码、项目在1280×720分辨率上显示有问题、如果要集成到自己的项目、得自己修改正一下问题、在 854x480上没有问题、项目编码UTF-8默认编译版本4、4、2、希望对大家有用
实现思路:
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的留言板)
感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛