手机九宫格解锁双鱼座图怎么绘

九宫格里画“花” 手机解锁图案美哭了(图)
在触屏上设置一笔连成的九宫格图案,登录时画一下设定的图形,这就是“密码”。近日,微信6.0正式上线后,除了新增潮爆朋友圈的“小视频”外,微信“钱包”也做出了全新改版,可设置“手势密码”。17日,微信公众号“微信派”发布了八大微信钱包“手势密码”,被网友喻为“神锁屏”。
“8大微信钱包 手势密码 ,美哭了系列,供君欣赏!”17日,微信公众号“微信派”发布了八大微信钱包“手势密码”,此微信立刻在朋友圈中被疯转。记者在微信中看到,每一个“手势密码”下面,都配上相应的和,以及绘制的,并且对其难易程度还进行了排名。其中最复杂的一款,当属“南海莲花”,线条相互交错,旁边还写着“请勿轻易尝试绘制此图形”的话语。其它的七种“手势密码”,根据由易到难依次为“后羿射日”、“鲁班锁”、“织女纺艺”、“木马流牛”、“诸葛连弩”、“电光人音墙”、“磁暴线圈”。90后网友“夕日流年”对此评价道:“这些锁键真的太难了,简直就是 自虐 的节奏”。
记者对20名网友进行了随机调查,其中73%的网友偏爱简单型的“手势密码”,27%的网友更热衷复杂型的“手势密码”。安全专家万仁国在接受记者采访时表示,“手势密码”和密码锁一样,都是为了防范他人轻易打开自己的手机。除非是手机本身存在漏洞,或隐私信息存放在SD卡上,一般情况下,“手势密码”都是可以起到保护作用的。
万仁国认为,出于对手机的安全性的考虑,设置的“手势密码”最好不要过于简单,复杂的图案有助于防止“手势密码”的破解。此外,在使用过程中,还要注意及时清除解锁痕迹和解锁时不要被其他人窥视。万仁国还表示,如果忘记解锁密码,在解锁错误输入5次后,机主可以使用PIN码或者登录账号来清除解锁密码,这样对数据不会产生影响。如果连PIN码或登录账号密码都记不清了,且手机不存在清除密码的漏洞,则只能以刷机的方式来解锁,而刷机则需要专业的手机维修人员来处理。 据《重庆商报》
本文来源:新华报业网-扬子晚报
关键词阅读:
不做嘴炮 只管约到
跟贴热词:
文明上网,登录发贴
网友评论仅供其表达个人看法,并不表明网易立场。
热门产品:   
:        
:         
热门影院:
热门搜索:Android开发(17)
好久没更新blog了,最近公司比较忙,旧的项目上线时间赶。加上新的项目又来了,于是导致都好久没去鸿洋的群里扯蛋了,做了一个不称职的管理员。说了好多遍的自定义萌系进度条都没有分享出来,在这给群里的各位说声抱歉,这次依然没有分享这个自定义的进度条。(你特么来打我呀~~)
由于公司新的项目需要用到九宫格手势密码解锁的功能,于是觉得自己写一个。废话不多说,直接上效果图:
首选我们来分析下实现的思路:
1. 绘制出相对于这个View的居中的九个点,作为默认状态的点
2. 点击屏幕的时候是否点击在这九个点上
3. 在屏幕上滑动的时候,绘制两个点之间的线条,以及选中状态的点
4. 手指离开屏幕的时候判断手势密码是否正确,如若错误这把错误状态下的点和线绘制出来。
具体实现:
首先我们得绘制出默认正常状态下的九个点:
* 点的bean
* Created by Administrator on .
public class Point {
public static final int STATE_NORMAL = 1;
public static final int STATE_PRESS = 2;
public static final int STATE_ERROR = 3;
int state = STATE_NORMAL;
public Point(float x, float y){
* 计算两点间的距离
* a 另外一个点
public float getInstance(Point a){
return (float) Math.sqrt((x-a.x)*(x-a.x) + (y-a.y)*(y-a.y));
可以看到,给一个点定义了x、y值以及这个点的状态有三种,默认的初始状态是正常的状态。
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPressPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mErrorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPressPaint.setColor(Color.parseColor("#00B7EE"));
mPressPaint.setStrokeWidth(7);
mErrorPaint.setColor(Color.parseColor("#FB0C13"));
mErrorPaint.setStrokeWidth(7);
mNormalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lock_point_normal);
mPressBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lock_point_press);
mErrorBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lock_point_error);
mPointRadius = mNormalBitmap.getWidth() / 2;
int width = getWidth();
int height = getHeight();
int offSet = Math.abs(width - height) / 2;
int offSetX = 0, offSetY = 0;
int pointItemWidth = 0;
if (width & height){
offSetX = offS
offSetY = 0;
pointItemWidth = height / 4;
if (width & height){
offSetX = 0;
offSetY = offS
pointItemWidth = width / 4;
mPoints[0][0] = new Point(offSetX + pointItemWidth, offSetY + pointItemWidth);
mPoints[0][1] = new Point(offSetX + pointItemWidth * 2, offSetY + pointItemWidth);
mPoints[0][2] = new Point(offSetX + pointItemWidth * 3, offSetY + pointItemWidth);
mPoints[1][0] = new Point(offSetX + pointItemWidth, offSetY + pointItemWidth * 2);
mPoints[1][1] = new Point(offSetX + pointItemWidth * 2, offSetY + pointItemWidth * 2);
mPoints[1][2] = new Point(offSetX + pointItemWidth * 3, offSetY + pointItemWidth * 2);
mPoints[2][0] = new Point(offSetX + pointItemWidth, offSetY + pointItemWidth * 3);
mPoints[2][1] = new Point(offSetX + pointItemWidth * 2, offSetY + pointItemWidth * 3);
mPoints[2][2] = new Point(offSetX + pointItemWidth * 3, offSetY + pointItemWidth * 3);
这段代码要注意的是横竖屏的偏移量,横屏的时候计算X轴的偏移量,竖屏的时候计算Y轴的偏移量。计算出x y的偏移量后,来初始化九个点的位置。我们要让九宫格的点绘制的位置在 当前这个自定义视图View的正中间,那么如上图显示,第一个点的起始点就是x = x轴的偏移量 + 格子宽度, y = y轴的偏移量
+ 格子宽度。以此可见第二列的点的x值 = 两个格子的宽度 + x轴的偏移量,同理第二行的点的y值 = 两个格子的宽度 + y周的偏移量。以此类推初始化九个点的位置。
九个点的位置初始化后,我们需要来绘制九个点,这里我用了三种状态的图片来作为顶点。在init()方法中,初始化了三种bitmap图片对象。以及计算了点的半径也就是图片的一半,当然我这里的三张图片大小是一样的。如果不一样,还是要重新计算过。
接下来就在onDraw方法里绘制出九个点:
protected void onDraw(Canvas canvas) {
drawPoints(canvas);
drawLines(canvas);
* 绘制所有的点
private void drawPoints(Canvas canvas){
for (int i = 0; i & mPoints. i++){
for (int j = 0; j & mPoints[i]. j++){
Point point = mPoints[i][j];
switch (point.state){
case Point.STATE_NORMAL:
canvas.drawBitmap(mNormalBitmap, point.x - mPointRadius, point.y - mPointRadius, mPaint);
case Point.STATE_PRESS:
canvas.drawBitmap(mPressBitmap, point.x - mPointRadius, point.y - mPointRadius, mPaint);
case Point.STATE_ERROR:
canvas.drawBitmap(mErrorBitmap, point.x - mPointRadius, point.y - mPointRadius, mPaint);
我们变量初始化好的九个点对象的状态,不同状态绘制不同的图片。这里绘制的时候要注意初始化点的时候的x、y值是包括了点圆的半径的,而绘制图片又是从左上角开始的,所以在绘制的时候需要减去图片本身的半径。
绘制后默认的九个点后,我们接下来处理手势滑动,覆写onTouchEvent方法:
* 获取选择的点的位置
private int[] getSelectedPointPosition(){
Point point = new Point(mX, mY);
for (int i = 0; i & mPoints. i++) {
for (int j = 0; j & mPoints[i]. j++) {
if(mPoints[i][j].getInstance(point) & mPointRadius){
int[] result = new int[2];
result[0] =
result[1] =
return null;
首先我们要判断手指点击的位置是否是在点上,获取屏幕触摸的点的位置mX、mY,初始化一个点,然后遍历所有的点与触摸点的距离 是否 小于 一个点的图片的半径,如果小于表示触摸的位置在这九个点中的一个上。getInstance(point)是计算两点之间的距离的方法。公式是:distance = Math.sqrt((x1 - x2)(x1 - x2) + (y1 - y2)
(y1 - y2))。如果是触摸的位置在点上,那就返回这个点的在九宫格数组中的下标位置。
我们来看onTouchEvent方法:
public boolean onTouchEvent(MotionEvent event) {
mX = event.getX();
mY = event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
resetPoints();
position = getSelectedPointPosition();
if (position != null){
isDraw = true;
i = position[0];
j = position[1];
mPoints[i][j].state = Point.STATE_PRESS;
mSelectedPoints.add(mPoints[i][j]);
mPassPositions.add(i * 3 + j);
case MotionEvent.ACTION_MOVE:
if (isDraw){
position = getSelectedPointPosition();
if (position != null){
i = position[0];
j = position[1];
if (!mSelectedPoints.contains(mPoints[i][j])){
mPoints[i][j].state = Point.STATE_PRESS;
mSelectedPoints.add(mPoints[i][j]);
mPassPositions.add(i * 3 + j);
case MotionEvent.ACTION_UP:
isDraw = false;
invalidate();
return true;
按下的时候坚持到触摸的位置就在点上的时候,就把这个点的状态改成被按下的状态,同时存入到mSelectedPoints被选中点的集合中。并标记现在是绘制的状态下。同样在移动手指的时候也是把检测到的点存储起来,修改状态为按下。当手指离开屏幕的时候,把标记改为不在绘制。然后通过invalidate()方法更新视图(会去调用onDraw方法绘制)。
通过上面的步骤,我们把选中的点都收集了起来,接下来就是绘制两个点连接线:
* 绘制两点之间的线
private void drawLine(Canvas canvas, Point a, Point b){
if (a.state == Point.STATE_PRESS){
canvas.drawLine(a.x, a.y, b.x, b.y, mPressPaint);
if (a.state == Point.STATE_ERROR){
canvas.drawLine(a.x, a.y, b.x, b.y, mErrorPaint);
绘制两点的连接线比较简单,我们只绘制按下和错误时候的连线。这是绘制单条连接线的。而我们的手势密码路径是有多条的,继续看:
* 绘制所有的线
private void drawLines(Canvas canvas){
if (mSelectedPoints.size() & 0){
Point a = mSelectedPoints.get(0);
for (int i = 1; i & mSelectedPoints.size(); i++){
Point b = mSelectedPoints.get(i);
drawLine(canvas, a, b);
if (isDraw){
drawLine(canvas, a, new Point(mX, mY));
如果被选中点的集合不是空的,那我们选择从第一个被选中点开始绘制连接线,遍历所有被选中点的时候就要从第二个点开始也就是index为1的时候,绘制完一个点,就要把下一次绘制连接线的起点改为这一次的连接线的终点,也是
a=b;这句的作用。所有被选中的点绘制完后,如果当前还处在绘制状态(手机没有离开屏幕),那我们就new一个手指触摸位置作为连接线的终点。好了所有的线都绘制完了,那我们只要在onDraw调用就好了:
protected void onDraw(Canvas canvas) {
drawPoints(canvas);
drawLines(canvas);
这样绘制的工作基本就完成了,接下来我们需要做一个用来监听手势滑动完后的接口:
public interface OnDrawFinishedListener{
boolean onDrawFinished(List&Integer& passPositions);
回调的方法里的passPositions是手势滑动的时候存储的九宫格的路径,对于九宫格路径的定义如图:
在onTouchEvent中,当Action动作是Up的时候(手指离开屏幕):就会触发手势密码绘制完成的接口:
case MotionEvent.ACTION_UP:
boolean valid = false;
if (mListener != null && isDraw){
valid = mListener.onDrawFinished(mPassPositions);
if (!valid){
for (Point p: mSelectedPoints){
p.state = Point.STATE_ERROR;
isDraw = false;
当设置了监听接口,并且还处于绘制状态的时候,回调接口把路径传出去给实现这个接口的使用者,然后在实现这个接口方法的地方判断和之前设置存储的手势密码是否一致,如果不一致返回为false。然后去修改所有的被选中的点的状态为错误的。然后invalidate()去更新视图。
路径给出去了,在最初设定的时候可以用md5等不可逆的加密方式存储在手机中。在需要解锁的时候,拿到这个md5值和解锁时候绘制的路径的md5值做比较就可以了:
&FrameLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jerry.testproject.ui.ScreenLockActivity"&
&com.jerry.testproject.widget.lockview.LockView
android:id="@+id/lockView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#2B2B2B"
&/FrameLayout&
LockView lockView = (LockView) findViewById(R.id.lockView);
lockView.setOnDrawFinishedListener(new LockView.OnDrawFinishedListener() {
public boolean onDrawFinished(List&Integer& passPositions) {
StringBuilder sb = new StringBuilder();
for (Integer i :
passPositions) {
sb.append(i.intValue());
String md5Str = MD5Utils.getMD5String(sb.toString());
boolean valid = comparePath(sb.toString());
if (valid){
Toast.makeText(ScreenLockActivity.this, "手势密码正确!", Toast.LENGTH_SHORT).show();
Toast.makeText(ScreenLockActivity.this, "手势密码错误,请重试!", Toast.LENGTH_SHORT).show();
至此自定义九宫格手势密码View介绍就结束了。
下面附上控件的源码和所用到的资源:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19063次
排名:千里之外
原创:18篇
评论:41条
(1)(3)(1)(5)(4)(1)(1)(1)(2)(1)(1)(3)(2)平板/笔记本
安卓手机图案锁破解方法
&独步江湖&
来自:浏览器
1.jpg (16.66 KB, 下载次数: 0)
16:59 上传
安卓手机的图形锁(九宫格)是3×3的点阵,按次序连接数个点从而达到锁定/解锁的功能。最少需要连接4个点,最多能连接9个点。网上也有暴力删除手机图形锁的方法,即直接干掉图形锁功能。但假如你想进入别人的手机,但又不想引起其警觉的话……你可以参考一下本文。
前提条件:手机需要root,而且打开调试模式。一般来讲,如果用过诸如“豌豆荚手机助手”、“360手机助手”一类的软件,都会被要求打开调试模式的。如果要删除手机内置软件,则需要将手机root。
  首先科普一下,安卓手机是如何标记这9个点的。通过阅读安卓系统源码可知,每个点都有其编号,组成了一个3×3的矩阵,形如:
  00 01 02
  03 04 05
  06 07 08
假如设定解锁图形为一个“L”形,如图:
2.jpg (28.09 KB, 下载次数: 0)
16:59 上传
那么这几个点的排列顺序是这样的:00 03 06 07 08。系统就记下来了这一串数字,然后将这一串数字(以十六进制的方式)进行SHA1加密,存储在了手机里的/data/system/gesture.key 文件中。我们用数据线连接手机和电脑,然后ADB连接手机,将文件下载到电脑上(命令:adb pull /data/system/gesture.key gesture.key),如图:
3.jpg (17.76 KB, 下载次数: 0)
16:58 上传
用WinHex等十六进制编辑程序打开gesture.key,会发现文件内是SHA1加密过的字符串:c8c0b24a15dc8bbfd,如图:
4.jpg (32.4 KB, 下载次数: 0)
16:58 上传
当你下次解锁的时候,系统就对比你画的图案,看对应的数字串是不是对应的加密结果。如果是,就解锁;不是就继续保持锁定。那么,如果穷举所有的数字串排列,会有多少呢?联想到高中的阶乘,如果用4个点做解锁图形的话,就是9x8x7x6=3024种可能性,那5个点就是15120,6个点的话60480,7个点个点个点362880。总共是985824种可能性(但这么计算并不严密,因为同一条直线上的点只能和他们相邻的点相连)。
  满打满算,也不到985824种可能性。乍一看很大,但在计算机面前,穷举出来这些东西用不了几秒钟。
  破解过程
  知道了原理,就着手写程序来实现吧。这里使用了Python来完成任务。主要应用了hashlib模块(对字符串进行SHA1加密)和itertools模块(Python内置,生成00-09的排列组合)。
  主要流程为:
  1、ADB连接手机,获取gesture.key文件
  2、读取key文件,存入字符串str_A
  3、生成全部可能的数字串
  4、对这些数字串进行加密,得到字符串str_B
  5、将字符串str_A与str_B进行对比
  6、如果字符串A,B相同,则说明数字串num就是想要的解锁顺序
  7、打印出数字串num
  下面为程序:
5.jpg (45.1 KB, 下载次数: 0)
16:58 上传
  从程序本身来说,得到解锁密码后应该用break跳出循环并终止程序运行。但Python并没有跳出多重循环的语句,如果要跳出多重循环,只能设置标志位然后不停进行判定。为了运行速度就略去了“跳出循环”这个步骤。(有没有更好的实现跳出多重循环的方法?)另外也略去了很多容错语句。
  从破解目的来说,如果单单是忘记了自己的手机图形锁密码,完全可以用更简单的办法:ADB连接手机,然后“adb rm /data/system/gesture.key”删除掉gesture.key文件,此时图形锁就失效了,随意画一下就能解锁。但本文开篇假设的是“为了不被察觉地进入到别人的手机里”,所以就有了这篇文章。
width:100%">
&独步江湖&
来自:浏览器
width:100%">
&花粉版主&
来自:浏览器
感谢分享教程,以前都是知其然不知其所以然~~
width:100%">
好基友勋章
花粉好机友,注册时间大于99天
在职斑竹的身份勋章,感谢斑竹的辛勤劳动
1000万花粉
纪念花粉俱乐部注册花粉数超过1000万
【重庆美空】【荷花之美】【鸟巢掠影】【城市变换】【画里山村】【黄土情缘】
花粉客户端
Make it Possible
Make your device special
华为云服务
Huawei cloud services
音乐播放器
Huawei Music
Huawei Vmall
没有最新动态
关注花粉俱乐部
联系我们:
|关注花粉俱乐部:
Copyright (C)
华为软件技术有限公司 版权所有 保留一切权利九宫格手机解锁图案 -
九宫格解锁是一款应用于iPhone手机的解锁软件,现成功移植到,软件是以画图案的方式来解锁手机锁定,在下次解锁屏幕时,只有按照设定好的模式滑动就可解锁,美女锁屏还新增多种超强功能,如设置特效、动画、签名等。
九宫格手机解锁图案 -
九宫格手机解锁图案1.美化了界面。2.修复了部分bug。3.一用即会,操作简单。4.添加了更多有趣的功能。5.资源初次浏览体验更流畅。6.锁屏耗电的优化。
九宫格手机解锁图案 -
在手机触屏上设置一笔连成的九宫格图案,登录时画一下设定的图形,这就是“”。网购党们都知道,现在支付宝钱包、微信钱包等手机支付客户端,都会要求用户设置手势密码确保安全。
九宫格手机解锁图案 -
九宫格手机解锁图案一组“手势神密码”图集在朋友圈疯传,八个解锁图案既复杂又兼具艺术性,让众多围观网友感叹:“把这种图案设置为解锁,简直就是‘自虐’的节奏!”每一个“手势密码”下面,都配上相应的图片和文字,以及绘制的方法,并且对其难易程度还进行了排名。其中最复杂的一款,当属“南海莲花”,线条相互交错。其它的七种“手势密码”,根据由易到难依次为“后羿射日”、“鲁班锁”、“织女纺艺”、“木马流牛”、“诸葛连弩”、“电光人音墙”、“磁暴线圈”。这些眼花缭乱的图案,让从事金融安全工作的资深IT男老陈都膜拜道:“这样解锁简直像玩益智游戏!果然是高手在民间!”
为本词条添加和相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
您也可以使用以下网站账号登录:
此词条还可添加&
编辑次数:4次
参与编辑人数:1位
最近更新时间: 18:51:45
贡献光荣榜}

我要回帖

更多关于 手机九宫格解锁软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信