由上图,可以看出,图案中手势的记录是1-9或0-8的,保存的顺序就是密码,当然有些是可以重复的,为了安全,肯定不能直接存原顺序,一定是要加密处理的,如MD5或Hash散列。 (作者: a day a better) 图案解锁中自定义View,是其中最为关键的一部分。下面是自定义LockView的实现,里面的注释写的很详细了。

<span style="font-size:14px;">package com.example.patternlock;import java.util.ArrayList;
import java.util.List;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;public class LockView extends View {private boolean inited = false;Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);// 抗锯齿Paint pressPaint = new Paint(); //按下时的画笔Paint errorPaint = new Paint(); //错误时的画笔private Bitmap bitmapPointError;private Bitmap bitmapPointPress;private Bitmap bitmapPointNormal;private float bitmapR; // 点的半径private boolean isDraw = false; //是否正在绘制float mouseX, mouseY;private Point [][] points = new Point[3][3];private ArrayList<point> pointList = new ArrayList<point>(); //保存经过的点private ArrayList<integer> passList = new ArrayList<integer>();private OnDrawFinishedListener listener;public LockView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);// TODO Auto-generated constructor stub}public LockView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public LockView(Context context) {super(context);// TODO Auto-generated constructor stub}@Overridepublic boolean onTouchEvent(MotionEvent event) {mouseX = event.getX();mouseY = event.getY();int [] ij;int i , j;switch (event.getAction()) {case MotionEvent.ACTION_DOWN:resetPoints();ij = getSelectedPoint();if(ij != null){isDraw = true;i = ij[0];j = ij[1];points[i][j].state = Point.STATE_PRESS;pointList.add(points[i][j]);passList.add(i * 3 + j);}break;case MotionEvent.ACTION_MOVE:if(isDraw){ij = getSelectedPoint();if(ij != null){i = ij[0];j = ij[1];if(!pointList.contains(points[i][j])){points[i][j].state = Point.STATE_PRESS;pointList.add(points[i][j]);passList.add(i * 3 + j);}               }}break;case MotionEvent.ACTION_UP:boolean valid = false;if(listener != null && isDraw){valid = listener.OnDrawFinished(passList);}if(!valid){for (Point p:pointList) {p.state = Point.STATE_ERROR;}}isDraw = false;break;default:break;}this.postInvalidate();return true;}private int[] getSelectedPoint() {Point pMouse = new Point(mouseX,mouseY);for (int i = 0; i < points.length; i++) {for (int j = 0; j < points[i].length; j++) {if(points[i][j].distance(pMouse) < bitmapR){int [] result = new int [2];result[0] = i;result[1] = j;return result;}}}return null;}public void resetPoints() {passList.clear();pointList.clear();for (int i = 0; i < points.length; i++){for (int j = 0; j < points[i].length; j++){points[i][j].state = Point.STATE_NORMOL;}}this.postInvalidate();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if(!inited){init();}drawPoints(canvas);if(pointList.size() > 0){ //画线 2->3,3->5 ...Point a = pointList.get(0);for (int i = 1;i < pointList.size(); i++){Point b = pointList.get(i);drawLine(canvas, a, b);a = b;}if(isDraw){ //  画最后一个点drawLine(canvas, a, new Point(mouseX, mouseY));}}}private void drawLine(Canvas canvas, Point a, Point b) {if(a.state == Point.STATE_ERROR){canvas.drawLine(a.x, a.y, b.x, b.y, errorPaint);}else if(a.state == Point.STATE_PRESS){canvas.drawLine(a.x, a.y, b.x, b.y, pressPaint);}}private void drawPoints(Canvas canvas) {for (int i = 0; i < points.length; i++) {for (int j = 0; j < points[i].length; j++) {if(points[i][j].state == Point.STATE_NORMOL){// normolcanvas.drawBitmap(bitmapPointNormal, points[i][j].x - bitmapR, points[i][j].y - bitmapR, paint);}else if(points[i][j].state == Point.STATE_PRESS){// presscanvas.drawBitmap(bitmapPointPress, points[i][j].x - bitmapR, points[i][j].y - bitmapR, paint);}else{// errorcanvas.drawBitmap(bitmapPointError, points[i][j].x - bitmapR, points[i][j].y - bitmapR, paint);}}}}private void init() {pressPaint.setColor(Color.YELLOW);pressPaint.setStrokeWidth(4);errorPaint.setColor(Color.RED);errorPaint.setStrokeWidth(4);bitmapPointError = BitmapFactory.decodeResource(getResources(), R.drawable.error);bitmapPointNormal = BitmapFactory.decodeResource(getResources(), R.drawable.normal);bitmapPointPress = BitmapFactory.decodeResource(getResources(), R.drawable.press);bitmapR = bitmapPointError.getWidth() / 2; //三种点的大小一样int width = getWidth();int height = getHeight();int offset = Math.abs(width - height) / 2;int offsetX, offsetY;int space;if(width > height){space = height / 4;offsetX = offset;offsetY = 0;}else{space = width / 4;offsetX = 0;offsetY = offset;}points[0][0] = new Point(offsetX +space , offsetY + space);points[0][1] = new Point(offsetX + 2*space , offsetY + space);points[0][2] = new Point(offsetX + 3 * space , offsetY + space);points[1][0] = new Point(offsetX +space, offsetY + 2 * space);points[1][1] = new Point(offsetX + 2 * space , offsetY + 2 * space);points[1][2] = new Point(offsetX + 3 * space , offsetY + 2 * space);points[2][0] = new Point(offsetX +space, offsetY + 3 * space);points[2][1] = new Point(offsetX + 2 * space , offsetY + 3 * space);points[2][2] = new Point(offsetX + 3 * space , offsetY + 3 * space);inited = true; //初始化完成}public interface OnDrawFinishedListener{boolean OnDrawFinished(List<integer> passList);}public void setOnDrawFinishedListener(OnDrawFinishedListener listener){this.listener = listener;}}
</integer></integer></integer></point></point></span>

设置密码:

<span style="font-size:14px;">package com.jikexueyuan.screenlock;import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.util.List;public class SettingActivity extends ActionBarActivity {List<integer> passList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_setting);final GestureLock lock = (GestureLock)findViewById(R.id.LockView);Button btn_reset = (Button)findViewById(R.id.btn_reset);Button btn_save = (Button)findViewById(R.id.btn_save);lock.setOnDrawFinishedListener(new GestureLock.OnDrawFinishedListener() {@Overridepublic boolean OnDrawFinished(List<integer> passList) {if (passList.size() < 3){Toast.makeText(SettingActivity.this, 密码不能少于3个点, Toast.LENGTH_SHORT).show();return false;}else {SettingActivity.this.passList = passList;return true;}}});btn_reset.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {lock.resetPoints();}});btn_save.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (passList != null){StringBuilder sb = new StringBuilder();for (Integer i : passList){sb.append(i);}SharedPreferences sp = SettingActivity.this.getSharedPreferences(password, SettingActivity.this.MODE_PRIVATE);SharedPreferences.Editor editor = sp.edit();editor.putString(password, sb.toString());editor.commit();Toast.makeText(SettingActivity.this, 保存完成, Toast.LENGTH_SHORT).show();}}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_setting, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}
</integer></integer></span>

检验密码:

package com.example.patternlock;import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Toast;import java.util.List;import com.example.patternlock.LockView.OnDrawFinishedListener;public class LockActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_lock);SharedPreferences sp = getSharedPreferences(password, this.MODE_PRIVATE);final String password = sp.getString(password, );LockView lock = (LockView)findViewById(R.id.LockView);lock.setOnDrawFinishedListener(new OnDrawFinishedListener() {@Overridepublic boolean OnDrawFinished(List<integer> passList) {StringBuilder sb = new StringBuilder();for (Integer i : passList){sb.append(i);}if (sb.toString().equals(password)){Toast.makeText(LockActivity.this, 正确, Toast.LENGTH_SHORT).show();return true;}else{Toast.makeText(LockActivity.this, 错误, Toast.LENGTH_SHORT).show();return false;}}});}
}
</integer>

安卓中图案解锁的实现原理和实现过程相关推荐

  1. Android中图案解锁的设计原理和实现过程

    Android中图案解锁 首先要理解图案的实现原理,上一张图:       由上图,可以看出,图案中手势的记录是1-9或0-8的,保存的顺序就是密码,当然有些是可以重复的,为了安全,肯定不能直接存原顺 ...

  2. android开发图案解锁,Android开发中图案解锁完整版

    学习目的 通过学习Android里面的onTouchEvent方法对上篇的图案解锁进行完善,调用touch方法实现触控功能和tag值得用法. 先关技术.及其使用 1.重写onTouchEvent方法 ...

  3. 上一封邮件下一封邮件返回邮件 新技能Get!如何破解安卓手机图案解锁‏

    在上看到的,觉得有趣就转载了一下 安卓手机的图形锁(九宫格)是 3 × 3 的点阵,按次序连接数个点从而达到锁定 / 解锁的功能.最少需要连接 4 个点,最多能连接 9 个点.网上也有暴力删除手机图形 ...

  4. 长沙理工大学第十二届ACM大赛-重现赛C 安卓图案解锁 (模拟)

    链接:https://ac.nowcoder.com/acm/contest/1/C 来源:牛客网 安卓图案解锁 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...

  5. 牛客每日练习----合并回文串,年轮广场,安卓图案解锁

    大提琴的声音就像一条河,左岸是我无法忘却的回忆,右岸是我值得紧握的璀璨年华,中间流淌的,是我年年岁岁淡淡的感伤. 链接:https://ac.nowcoder.com/acm/problem/1323 ...

  6. android屏幕解锁图案,安卓手机图案屏幕锁解锁方法!!

    当你的安卓手机密码锁忘记了怎么办?今天一不小心把手机改了图案锁结果由于改的时候匆忙结果忘记了,在网上找了好多方法都无果,也有人说重新刷机就会好!!这个简直就是废话,刷机当然能好了!! 关键是解锁要解决 ...

  7. 安卓图案解锁NC13585

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 栗主席(lizi)是某xxxx大学的一个不 ...

  8. [源码]Android安卓应用手势锁图案解锁的实现

    交互细节 用户首先使用账号/密码进行登录. 登录成功后,判断是否是第一次登录使用,如果是第一次则显示创建手势密码的界面,要求用户创建手势锁. 创建的过程中要求用户连接至少四个点,并且绘制两次以确认绘制 ...

  9. 刷题记录:牛客NC13585安卓图案解锁

    传送门:牛客 栗主席(lizi)是某xxxx大学的一个不得了的程序猿,然而没想到吧,他竟然有女盆友,我们假设为QAQ!!! 那天,QAQ问栗子:你的小米5s的图像解锁密码到底是多少? 栗子:嘛?我仔细 ...

最新文章

  1. 吴恩达的二八定律:80%的数据+20%的模型=更好的机器学习
  2. elasticsearch批量修改,批量更新某个字段
  3. Scriptis安装(基于Linkis开发的数据分析工具)
  4. 使用javap分析Java的字符串操作
  5. html两个框架同时_两个框架的故事
  6. ALTER 简单操作(mysql)
  7. android+3.0新加的动画,Android动画片
  8. “视网膜”重装来袭 AI技术为视频业务场景赋能
  9. 数组对象的slice和splice方法
  10. 【分享-windows文件快速搜索神器】Everything 免费、快速搜索文件/文件夹
  11. 【报告分享】2019年中国智能门锁发展与应用白皮书.pdf
  12. 华为向emui输入鸿蒙,新颜值/新功能/新体验!EMUI 11上手:手机鸿蒙OS的提前预演...
  13. 写代码:实现用户输入用户名和密码,当用户名为seven且密码为123时,显示登录成功,否则失败,失败时允许重复输入三次。...
  14. 敏捷开发之道(六)计划(续)
  15. psd导出jpg太大_保存技巧,完美解决PS导出文件过大的问题
  16. “造星工厂“乐华娱乐IPO,如何寻找下一个“王一博“?
  17. 大数据与人工智能在物联网工程的应用
  18. 计算机网络(一)网络分层及协议
  19. 今天是国际数学日,既是爱因斯坦的生日又是霍金的忌日
  20. Unity中初步使用Navmesh寻路系统

热门文章

  1. springboot银行客户管理系统毕业设计源码250903
  2. 初中计算机竞赛面试题目及答案,2019上半年初中信息技术教师资格面试真题及答案(第二批)...
  3. 教你一招搞定 Homebrew 下载加速!
  4. 正则表达式截取以什么开头和什么结尾_有些爱情故事可以猜到开头,没有猜到结尾,为什么?路遥性格分析...
  5. react获取不到目录中文件的坑
  6. 公共关系礼仪实务章节测试题——公共关系概述(一)
  7. qfp封装能够linux,MCU的封装也是很有门道的...
  8. win8.1 下 安装bing输入法
  9. css:块元素、行内元素、行内块元素以及三种元素之间的转换
  10. Linux cgroup详解(理论与实例)