我们经常会在app中看到图案解锁的功能,所以寻思做一个,在某客视频上看到了教程,自己跟着做了一遍,记录一下,顺便理清一下思路。
思路讲解:
首先自定义一个图案的view,其中实现onDraw方法,以及添加接口回调进行验证密码正确性。
自定义view效果如下:
首先新建一个记录点的坐标的一个bean
public class Point {
//表示图案状态
public static int STATE_NORMAL=0;
public static int STATE_PRESS=1;
public static int STATE_ERROR=2;
//坐标
float x,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;
}
}
下面是自定义view代码:
public class GestureLockView extends View {
//三张不同状态圆的图片
private Bitmap error,normal,press;
//
private ArrayList<Point> pointlist=new ArrayList<>();
//设置圆的坐标位置的数组
private Point[][] points=new Point[3][3];
//画圆的画笔(后面的参数为抗锯齿的作用)
private Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
//设置回调监听事件
private OnDrawFinsihListner listner;
//保存圆的半径
private float radius;
public GestureLockView(Context context) {
super(context);
}
public GestureLockView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public GestureLockView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//判断是否初始化
private boolean inited=false;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//ondraw方法会多次调用所以要设置标记位判断是否调用过
if (!inited){
init();
}
//画图
drawPoints(canvas);
//画线
if (pointlist.size()>0)
{ //冲重第一个点画起
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 drawPoints(Canvas canvas){
for (