Android 图形锁的实现
来源:互联网 发布:二维数组排序 php 编辑:程序博客网 时间:2024/06/05 08:54
涉及到的技术:
自定义控件
数据算法
实现原理:
自定义一个view,里面画九个不同的点,同时监听手指的触摸事件,并且将触摸的点的坐标记录和设置的记录比较一下,如果一致整验证成功,否则验证失败。
自定义控件
1.将9个点画在屏幕的中间。我这边采用的是(高度-宽度)/2---作为便宜量,里面是一个4*4的正方行,依次画出九个点
代码如下:
offset=(height-width)/2;
space=width/4;
points[0][0]=new Point(space,offset+space); points[0][1]=new Point(space*2,offset+space); points[0][2]=new Point(space*3,offset+space); points[1][0]=new Point(space,offset+space*2); points[1][1]=new Point(space*2,offset+space*2); points[1][2]=new Point(space*3,offset+space*2); points[2][0]=new Point(space,offset+space*3); points[2][1]=new Point(space*2,offset+space*3); points[2][2]=new Point(space*3,offset+space*3);
2.根据坐标画圆(注意要减去图片的一半,偏移量)
for (int i=0;i<points.length;i++){ for (int j=0;j<points[i].length;j++){ if(points[i][j].state==Point.point_normal){ canvas.drawBitmap(normal,points[i][j].x-normal.getHeight()/2,points[i][j].y-normal.getHeight()/2,paint); }else if(points[i][j].state ==Point.point_press){ canvas.drawBitmap(press,points[i][j].x-normal.getHeight()/2,points[i][j].y-normal.getHeight()/2,paint); }else if(points[i][j].state ==Point.point_error){ canvas.drawBitmap(error,points[i][j].x-normal.getHeight()/2,points[i][j].y-normal.getHeight()/2,paint); } }}
3.触摸事件的处理,需要重写view中的onTouchEvent方法 主要是处理点击,移动和抬起事件 。里面涉及到一个选点的方法,我在point这个实体中添加了一个测量两个点之间的距离的方法,用于判断触摸点的位 置。
public boolean onTouchEvent(MotionEvent event) { motionX=event.getX(); motionY=event.getY(); int[] result; switch (event.getAction()){ case MotionEvent.ACTION_DOWN: reset(); result=getSelectedPoint(); if(result!=null){ isDraw=true; points[result[0]][result[1]].state=Point.point_press; selectPoint.add(points[result[0]][result[1]]); password.add(result[0]*3+result[1]); } break; case MotionEvent.ACTION_MOVE: if(isDraw){ result=getSelectedPoint(); if(result!=null){ if(!selectPoint.contains(points[result[0]][result[1]])){ points[result[0]][result[1]].state=Point.point_press; selectPoint.add(points[result[0]][result[1]]); password.add(result[0]*3+result[1]); } } } break; case MotionEvent.ACTION_UP: boolean flag=false; if(listener!=null&&isDraw){ flag=listener.onFinishedListener(password); } if(!flag){ for (int i=0;i<selectPoint.size();i++){ selectPoint.get(i).state=Point.point_error; } } isDraw=false; break; } this.postInvalidate(); return true;}
4.连接触摸的点涉及到一个划线的方法
private void drawLine(Canvas canvas,Point a,Point b){ if(a.state==Point.point_press){ canvas.drawLine(a.x,a.y,b.x,b.y,pressPaint); } if(a.state==Point.point_error){ canvas.drawLine(a.x,a.y,b.x,b.y,errorPaint); }}
5.重置功能的实现
public void reset(){ selectPoint.clear(); password.clear(); for(int i=0;i<points.length;i++){ for (int j=0;j<points[i].length;j++){ points[i][j].state=Point.point_normal; } } this.postInvalidate();}
6.向外提供接口的实现
private OnDrawFinishedListener listener;public interface OnDrawFinishedListener{ public boolean onFinishedListener(ArrayList<Integer> pass);}public void setOnDrawFinishedListerer(OnDrawFinishedListener listener){ this.listener=listener;}
这样自定义的锁的界面基本实现了。
里面需要主要的一些细节:
1.初始化的时候只能初始化一边,要不就没有效果出现
2.重置功能一定要调用重绘函数
3.划线的时候注意点位置的变化。
其他我就不介绍了。
0 0
- Android 图形锁的实现
- android 圆环图形的实现
- Android图形系统的底层实现
- Android下实现各种图形的绘制
- Android图形系统的底层实现
- Android图形验证码的实现
- android 图形底层实现
- Android 实现图形解锁
- 图形类的实现
- 实现能动的图形
- 实现能动的图形
- 实现能动的图形
- 图形钟表的实现
- ANDROID实现圆形图形不断旋转的动画
- android中实现自定义view中图形的缩放
- 每日一学(一)android图形验证码的实现
- Android的图形系统
- android的图形系统
- 南阳OJ独木舟上的旅行
- Veriog_Notes_Summary 2
- VREFpin的作用,为什么要做参考
- python实现ftp的基本功能
- 函数重载
- Android 图形锁的实现
- LeetCode(144) Binary Tree Preorder Traversal
- centos7.1 QT5编译出现:cannot find -lGL 和 collect2:error:ld returned 1 exit status 错误
- 二维数组行列转换
- HTML5应用:setCustomValidity(message)接口
- graph.h
- POJ 3032 Card Trick 纸牌顺序
- JVM 运行时数据区
- poj2965_The Pilots Brothers' refrigerator(bfs)