文章目录
思路
主界面:
设置密码、验证密码、修改密码
fragment
实现方式,自定义View。
如何自定义View?自定义什么View?自定义View需要什么样子的功能?能否让它更加有可修改性?
参考资料:
Android 自定义控件实现九宫格解锁
样式实现
实践 - 先画一个圆
自定义View的样式实现
获取界面大小,获取中心坐标,获取每个半径的大小
@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
drawDefaultCircle(canvas);
}
private void drawDefaultCircle(Canvas canvas) {
if (viewHeight == 0) {
//获取view的长和宽。之后绘制圆形
Log.d(TAG, "必须在onDraw中,才能获得view的大小");
viewHeight = getMeasuredHeight();
viewWidth = getMeasuredWidth();
}
float minLength = Math.min(viewHeight, viewWidth); //画正方形式的九宫格
center_x = (getRight() - getLeft()) / 2;
center_y = (getBottom() - getTop()) / 2; //获得绘制的中心点
int pointNumber = getResources().getInteger(R.integer.point_number);
int rowNumber = (int) Math.sqrt(pointNumber); //画几排?每排几个?因为是正方形所以是排数和行数相同
circleRadius_default = minLength / rowNumber * 2 + rowNumber + 1; //2n个半径,每个圆相隔1个半径(带系统边界) = n+1
canvas.drawCircle(center_x, center_y,
circleRadius_default, paint_default); //先画一个看看
}
实践反馈
- 画笔粗一点
- 为什么半径大小不对?
算术优先级- -。circleRadius_default = minLength / (rowNumber * 2 + rowNumber + 1);
初步实现样式
private void init() {
paint_default = new Paint(Paint.ANTI_ALIAS_FLAG);
paint_default.setStyle(Paint.Style.STROKE); //描边画笔
paint_default.setColor(getContext().getColor(R.color.Color8328_1)); //画笔颜色
paint_default.setStrokeWidth(5);
//这个时候用getMeasuredHeight()是不是还不会显示的哇。因为View还没有初始化
viewHeight = getMeasuredHeight();
viewWidth = getMeasuredWidth();
}
@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
drawDefaultCircle(canvas);
}
private void drawDefaultCircle(Canvas canvas) {
if (viewHeight == 0) {
//获取view的长和宽。之后绘制圆形
Log.d(TAG, "必须在onDraw中,才能获得view的大小");
viewHeight = getMeasuredHeight();
viewWidth = getMeasuredWidth();
}
float minLength = Math.min(viewHeight, viewWidth); //画正方形式的九宫格
// Log.d(TAG, "view的长度为:");
center_x = (getRight() - getLeft()) / 2;
center_y = (getBottom() - getTop()) / 2; //获得绘制的中心点
int pointNumber = getResources().getInteger(R.integer.point_number);
//画几排?每排几个?因为是正方形所以是排数和行数相同
int rowNumber = (int) Math.sqrt(pointNumber);
Log.d(TAG, "行列数 " + rowNumber);
//2n个半径,每个圆相隔1个半径(带系统边界) = n+1
circleRadius_default = minLength / (rowNumber * 2 + rowNumber + 1);
for (int i = 0; i < rowNumber; i++) {
//一排,修改y坐标
float point_y = center_y - (1 - i) * 3 * circleRadius_default;
for (int j = 0; j < rowNumber; j++) {
//修改x坐标
float point_x = center_x - (1 - j) * 3 * circleRadius_default;
canvas