思路:九宫格是位于屏幕中间的,一个大方格
中,套了16个小方格
计算出大方格距离顶部的偏移量offset
距离中左边的距离是0
计算小方格的宽度
计算出点的半径
根据上面的条件就能算出9个点的坐标就能处置9个点
具体代码如下:
自定义控件GestureLock
package com.zhh.shoushimima;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
/**
* 自定义图案解锁控件
*/
public class GestureLock extends View {
// 存放点对象的数组
private Point[][] points = new Point[3][3];
// 判断是否初始化,onDraw方法会被多次调用,我只要初始化一次
private boolean inited = false;
// 三种状态下点对应的Bitmap;用于绘制图片
private Bitmap bitmapPointError;
private Bitmap bitmapPointNormal;
private Bitmap bitmapPointPress;
// 圆圈的半径
private float bitmapR;
// 画笔,用来绘制图片
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
/**
* 构造方法
*
* @param context
*/
public GestureLock(Context context) {
super(context);
}
public GestureLock(Context context, AttributeSet attrs) {
super(context, attrs);
}
public GestureLock(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* 绘制
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 初始化(只能在这里初始化)
if (!inited) {
init();
}
// 绘制点
drawPoints(canvas);
}
/**
* 初始化方法
*/
private void init() {
// 初始化三种状态对应的位图
bitmapPointError = BitmapFactory.decodeResource(getResources(), R.drawable.error);
bitmapPointNormal = BitmapFactory.decodeResource(getResources(), R.drawable.normal);
bitmapPointPress = BitmapFactory.decodeResource(getResources(), R.drawable.press);
// 计算出图片的半径
bitmapR = bitmapPointError.getHeight() / 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 + space * 2, offsetY + space);
points[0][2] = new Point(offsetX + space * 3, offsetY + space);
points[1][0] = new Point(offsetX + space, offsetY + space * 2);
points[1][1] = new Point(offsetX + space * 2, offsetY + space * 2);
points[1][2] = new Point(offsetX + space * 3, offsetY + space * 2);
points[2][0] = new Point(offsetX + space, offsetY + space * 3);
points[2][1] = new Point(offsetX + space * 2, offsetY + space * 3);
points[2][2] = new Point(offsetX + space * 3, offsetY + space * 3);
// 防止重复初始化
inited = true;
}
/**
* 绘制点
*
* @param canvas
*/
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_NORMAL) {
//Normal 正常状态 绘制图片
canvas.drawBitmap(bitmapPointNormal, points[i][j].x - bitmapR, points[i][j].y - bitmapR, paint);
} else if (points[i][j].state == Point.STATE_PRESS) {
//Press 按下状态 绘制图片
canvas.drawBitmap(bitmapPointPress, points[i][j].x - bitmapR, points[i][j].y - bitmapR, paint);
} else {
//ERROR 错误状态 绘制图片
canvas.drawBitmap(bitmapPointError, points[i][j].x - bitmapR, points[i][j].y - bitmapR, paint);
}
}
}
}
}
实体类 Point
package com.zhh.shoushimima;
/**
* Created by 泽群 on 2015/6/20.
* 保存9个点
*/
public class Point {
// 正常状态
public static int STATE_NORMAL = 0;
// 按下状态
public static int STATE_PRESS = 1;
// 错误状态
public static int STATE_ERROR = 2;
// 当前点的x值
float x;
// 当前点的y值
float y;
// 保存当前点的状态
int state = STATE_NORMAL;
// 构造函数,构造点
public Point(float x, float y)
{
this.x = x;
this.y = y;
}
public float distance(Point a)
{
float distance = (float) Math.sqrt((x - a.x) * (x - a.x) + (y - a.y) * (y - a.y));
return distance;
}
}
在布局文件activity_main.xml应用控件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.zhh.shoushimima.GestureLock
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</com.zhh.shoushimima.GestureLock>
</RelativeLayout>
源码下载:
https://download.csdn.net/download/zhaihaohao1/10667418
参考视频:
https://www.jikexueyuan.com/course/1592.html