Android自定义控件----继承View图案解锁1,绘制9个点

Android自定义控件----继承View图案解锁1,绘制9个点_第1张图片Android自定义控件----继承View图案解锁1,绘制9个点_第2张图片

思路:九宫格是位于屏幕中间的,一个大方格
中,套了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应用控件

"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>


源码下载:
https://download.csdn.net/download/zhaihaohao1/10667418
参考视频:
https://www.jikexueyuan.com/course/1592.html

你可能感兴趣的:(自定义)