相信大家都有使用九宫格解锁,比如在设置手机安全项目中,可以使用九宫格解锁,提高安全性,以及在使用支付功能的时候,为了提高安全使用九宫锁,今天就为大家介绍Android实现九宫格的方法,分享给大家供大家参考。具体如下:

运行效果截图如下:

具体代码如下:

布局文件如下:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".MainActivity" >

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello_world" />

从布局文件中可以看出需要自定义一个View用于绘制九宫格图案:

SudokuView.java

package com.xuliugen.jiugongge;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.Toast;

public class SudokuView extends View {

private static final int DEFALUT_CELL_WIDTH = 60; //默认的cell宽度

private static final int DEFALUT_CELL_STROKE_WIDTH = 2;

private static final int DEFALUT_SPACE = DEFALUT_CELL_WIDTH >> 1;

private Cell mCells[] = new Cell[9]; // 九宫格:定义用于存放九个数组

private int mCellWidth;

private int mCellRadius;

private int mCellStrokeWidth;

private int mSpace;

private Paint mPaintNormal;

private Paint mPaintSelected;

private int mWidth;

private int mHeight;

private float mCurrentX;

private float mCurrentY;

private boolean mFinish = false;

private StringBuffer mSbSelected = new StringBuffer(20);

/**

* 下边是三个构造方法:每一个构造方法中有一个初始化操作

*/

public SudokuView(Context context) {

super(context);

init();

}

public SudokuView(Context context, AttributeSet attrs) {

super(context, attrs);

init();

}

public SudokuView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init();

}

/**

* 初始化操作

*/

private void init() {

mCellWidth = DensityUtil.dip2px(getContext(), DEFALUT_CELL_WIDTH);

mCellRadius = DensityUtil.dip2px(getContext(), DEFALUT_CELL_WIDTH >> 1);

mCellStrokeWidth = DensityUtil.dip2px(getContext(),

DEFALUT_CELL_STROKE_WIDTH);

mSpace = DensityUtil.dip2px(getContext(), DEFALUT_SPACE);

mPaintNormal = new Paint();

mPaintNormal.setColor(Color.WHITE);

mPaintNormal.setStrokeWidth(mCellStrokeWidth);

mPaintNormal.setStyle(Paint.Style.STROKE);

mPaintNormal.setAntiAlias(true);

mPaintSelected = new Paint();

mPaintSelected.setColor(Color.CYAN);

mPaintSelected.setStrokeWidth(mCellStrokeWidth);

mPaintSelected.setStyle(Paint.Style.STROKE);

mPaintSelected.setAntiAlias(true);

Cell cell;

float x;

float y;

for (int i = 0; i < 9; i++) {

x = mSpace * (i % 3 + 1) + mCellRadius + mCellWidth * (i % 3);

y = mSpace * (i / 3 + 1) + mCellRadius + mCellWidth * (i / 3);

cell = new Cell(x, y);

mCells[i] = cell;

}

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

drawCell(canvas);

drawLine(canvas);

}

private void drawCell(Canvas canvas) {

for (int i = 0; i < 9; i++) {

canvas.drawCircle(mCells[i].getCenterX(), mCells[i].getCenterY(),

mCellRadius, mCells[i].isSelected() ? mPaintSelected

: mPaintNormal);

}

}

private void drawLine(Canvas canvas) {

if ("".equals(mSbSelected.toString())) {

return;

}

String[] selectedIndexs = mSbSelected.toString().split(",");

Cell cell = mCells[Integer.valueOf(selectedIndexs[0])];

Cell nextCell;

if (selectedIndexs.length > 1) {

for (int i = 1; i < selectedIndexs.length; i++) {

nextCell = mCells[Integer.valueOf(selectedIndexs[i])];

canvas.drawLine(cell.getCenterX(), cell.getCenterY(),

nextCell.getCenterX(), nextCell.getCenterY(),

mPaintSelected);

cell = nextCell;

}

}

if (!mFinish) {

canvas.drawLine(cell.getCenterX(), cell.getCenterY(), mCurrentX,

mCurrentY, mPaintSelected);

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

mWidth = getRealSize(widthMeasureSpec);

mHeight = getRealSize(heightMeasureSpec);

setMeasuredDimension(mWidth, mWidth);

}

private int getRealSize(int measureSpc) {

int result;

int mode = MeasureSpec.getMode(measureSpc);

int size = MeasureSpec.getSize(measureSpc);

if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.UNSPECIFIED) {

result = mCellWidth * 3 + mSpace * 4;

} else {

result = size;

}

return result;

}

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

if (mFinish) {

for (int i = 0; i < 9; i++) {

mCells[i].setSelected(false);

}

mFinish = false;

mSbSelected.delete(0, mSbSelected.length());

invalidate();

return false;

}

handleDownEvent(event);

break;

case MotionEvent.ACTION_UP:

mFinish = true;

Toast.makeText(getContext(), mSbSelected.toString(),

Toast.LENGTH_SHORT).show();

break;

case MotionEvent.ACTION_MOVE:

handleMoveEvent(event);

break;

}

return true;

}

private void handleMoveEvent(MotionEvent event) {

int index = findCellIndex(event.getX(), event.getY());

if (index != -1) {

mCells[index].setSelected(true);

mSbSelected.append(index).append(",");

}

invalidate();

mCurrentX = event.getX();

mCurrentY = event.getY();

}

private void handleDownEvent(MotionEvent event) {

int index = findCellIndex(event.getX(), event.getY());

if (index != -1) {

mCells[index].setSelected(true);

mSbSelected.append(index).append(",");

invalidate();

}

mCurrentX = event.getX();

mCurrentY = event.getY();

}

private int findCellIndex(float x, float y) {

float cellX;

float cellY;

int result = -1;

for (int i = 0; i < 9; i++) {

if (mCells[i].isSelected()) {

continue;

}

cellX = mCells[i].getCenterX();

cellY = mCells[i].getCenterY();

float tempX = cellX - x;

float tempY = cellY - y;

float distance = (float) Math.sqrt(tempX * tempX + tempY * tempY);

if (distance < mCellRadius) {

result = i;

break;

}

}

return result;

}

}

MainActivity.java如下:

package com.xuliugen.jiugongge;

import android.os.Bundle;

import android.support.v7.app.ActionBarActivity;

import android.view.Menu;

import android.view.MenuItem;

public class MainActivity extends ActionBarActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.menu_main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

int id = item.getItemId();

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

}

另外还需要一个存放圆圈的Javabean

package com.xuliugen.jiugongge;

/**

* 代表每一个九宫格圆圈的Javabean

* @author xuliugenpc

*/

public class Cell {

private float centerX;

private float centerY;

private boolean selected;

public Cell(float x, float y) {

centerX = x;

centerY = y;

}

public float getCenterX() {

return centerX;

}

public void setCenterX(float centerX) {

this.centerX = centerX;

}

public float getCenterY() {

return centerY;

}

public void setCenterY(float centerY) {

this.centerY = centerY;

}

public boolean isSelected() {

return selected;

}

public void setSelected(boolean selected) {

this.selected = selected;

}

}

像素转换的工具类:

package com.xuliugen.jiugongge;

import android.content.Context;

/**

* 手机屏幕px转dp和dp转px工具类

* @author xuliugenpc

*/

public class DensityUtil {

private static float scale;

/**

* 根据手机的分辨率从 dp 的单位 转成为 px(像素)

*/

public static int dip2px(Context context, float dpValue) {

if (scale == 0) {

scale = context.getResources().getDisplayMetrics().density;

}

return (int) (dpValue * scale + 0.5f);

}

/**

* 根据手机的分辨率从 px(像素) 的单位 转成为 dp

*/

public static int px2dip(Context context, float pxValue) {

if (scale == 0) {

scale = context.getResources().getDisplayMetrics().density;

}

return (int) (pxValue / scale + 0.5f);

}

}

以上就是Android实现九宫格解锁的方法,希望本文所述对大家学习有所帮助。

9宫格解锁 android_Android实现九宫格解锁相关推荐

  1. 9宫格解锁 android_Android实现九宫格解锁的实例代码

    当年感觉九宫格解锁很是高大上,一脸懵逼,今天正好要做解锁这一块业务,回头来看九宫格,这特么简单啊 首先理清一下逻辑,我们要做NxN的九宫格 下图是3x3的简单图例 // -(--)-(--)-(--) ...

  2. 9宫格解锁 android_Android之九宫格解锁的实现

    /*** * 九宫格解锁 * *@authorway **/ public class LocusPassWordView extendsView {private float w = 0;priva ...

  3. 9宫格解锁 android_android开发图案解锁学习记录一(九宫格的绘制)

    图案解锁的原理: 九宫格解锁故名思议就是要有九个宫格:然后宫格间进行连线. 首先我们要先绘制九个点(宫格),确定位置,然后绘制不同的图案. 图案分为不同的状态:正常的状态,按下时的状态和错误的状态 当 ...

  4. android九宫格布局解锁,Android onDraw()--九宫格解锁

    onDraw这个方法在自定义中尤其重要,我们可以measure之后通过Canvas进行绘制,九宫格解锁这个View现在已经被人脸跟指纹给替代了,但是做起来还是有点东西的. 下面就是做这个View的思路 ...

  5. 9宫格解锁 android_手机九宫格解锁密码忘记了怎么办?忘记安卓九宫格解锁密码解决方法...

    法一: 使用第三方手机管理软件中的清除密码功能.前提是手机之前已经root并且usb调试模式处于打开状态.此方法不能保证100%有效,仅作为忘记密码后的尝试方法. 例如:刷机精灵中实用工具中的清除密码 ...

  6. 软件九宫格解锁之逻辑以及界面控制

    其实九宫格解锁在Android上不是什么新鲜的东西,至今还有不少人的锁屏界面的解锁方式是九宫格解锁,但至于app九宫格解锁的要求,本人至今只使用支付宝的九宫格解锁 最近在做一个app的时候有一个需求, ...

  7. JS 时间函数实现9宫格抽奖

    JS 时间函数实现9宫格抽奖 思路:九宫格抽奖抽象出来,其实就是点击开始按钮以后,从首个单元开始,不停的绕着8个格子转动,最后停留在目标位置. 以下是html部分: <div class=&qu ...

  8. PHP直播平台源码Android自定义View:9宫格图形手势解锁

    9宫格图形解锁的操作就是在9个点上进行的,所以我们先定义一个点类,该类主要用于存储点的信息:坐标,状态,位置. public class Point {//正常状态public static int ...

  9. Android 图案解锁 9宫格密码解锁

    序言  第一次写Android技术博客,不知道该如何下手. 背景  现在人们越来越重视自己的隐私,对于一些涉及用户隐私的应用,用户可能会希望在应用启动时必须先输入密码.传统的数字式密码记忆繁琐.容易破 ...

最新文章

  1. css3 box-sizing:border-box 实现div一行多列
  2. 织梦dedecms search.php注入漏洞exp,DedeCms V57 plus/search.php 文件SQL注射0day漏洞
  3. 普通人改变命运最关键的这几种方法
  4. linux目标机无法连接到网络,linux 安装了xunsearch服务,但是PHP连接显示:目标计算机积极拒绝...
  5. 热烈庆祝个人博客突破1万人!
  6. 04 Ribbon介绍
  7. 关于RAID与SCSI的一些基本概念(一)
  8. c#winform选择文件,文件夹,打开指定目录方法
  9. 字节码指令之控制转移指令
  10. [转载] vim风格设置
  11. 福州万宝产业园的远程预付费电能管理系统
  12. 基于WebRTC开源框架的实时视频聊天项目,搭建私人实时通信服务
  13. 微信表情存入mysql
  14. 淘宝上线独立搜索引擎一淘网
  15. 改变手机状态栏颜色常见的2种方法
  16. Python3脚本抢票
  17. 软考有什么用?最全软考详解
  18. Excel VBA ListBox列表框学习
  19. 13th-极客大挑战
  20. 2.2 线性微分方程与常数变易法

热门文章

  1. 高职计算机自主招生面试题,高职自主招生面试题
  2. 微信小程序多页面共用一个数据globalData,并及时同步更新各页面的数据的做法
  3. 适合小白的大白话讲解---Git与Github的区别
  4. Android语音播报、后台播报、语音识别
  5. Mesos/Omega/Borg(K8S)/Firemament对比
  6. 纯CSS边框渐变动画
  7. python视觉识别字_Python怎么识别文字?正确 的方法详解
  8. 【理财入门二】复利思维
  9. 关于Deepin商店没有应用的解决办法
  10. 痞子衡嵌入式:我的三个小项目陆续上线恩智浦官方Github