九宫格锁屏模块,九宫格设置密码

要使用九宫格设置密码,先用自定义一个九宫格样式,使用的自定义的view画出九个点,然后重写onMeasure和onDraw,这两个方法,并处理onTouchEvent,这个事件

在Android视图的绘制和布局过程中,onMeasure和onDraw这两个方法的调用顺序是固定的。以下是它们通常的调用顺序:

onMeasure:
当一个视图被添加到布局容器中,或者其布局参数发生变化时,系统会首先调用视图的onMeasure方法。
onMeasure方法的目的是确定视图应该占据的空间大小,即视图的测量宽度和高度。
视图根据自身的内容、布局参数、以及来自父布局的测量规格(MeasureSpec)来决定自己的最佳大小。
一旦确定了测量大小,视图会通过调用setMeasuredDimension方法来设置其测量宽度和高度。
onLayout:
在所有子视图的onMeasure方法被调用并返回之后,父布局会调用其onLayout方法。
onLayout方法的目的是确定每个子视图在父布局中的精确位置。
父布局会根据子视图的测量大小和布局参数,以及自身的布局算法,来计算每个子视图的位置。
父布局会调用每个子视图的layout方法来设置其位置和大小。
onDraw:
在onLayout方法完成之后,如果视图需要绘制内容(即它不是一个透明的或者空的视图),那么它的onDraw方法会被调用。
onDraw方法的目的是在视图的画布上绘制内容。
在onDraw方法中,视图可以使用Canvas对象来绘制形状、文本、图片等。
通常,自定义视图会重写onDraw方法来提供自定义的绘制逻辑。
简而言之,onMeasure首先被调用以确定视图的大小,接着是onLayout来确定视图在父布局中的位置,最后是onDraw来在视图的画布上绘制内容。这个流程是Android视图绘制和布局的核心机制。
当在Android开发中处理View的onTouchEvent事件时,可以通过重写onTouchEvent方法来定义视图如何响应触摸事件。

九宫格锁屏
    public NinePointLineView(Context context) {super(context);cxt = context; initPaint();}protected void onDraw(Canvas canvas) {//画九点drawNinePoint(canvas);super.onDraw(canvas);}

public class NinePointLineView extends View {Paint linePaint = new Paint();Paint whiteLinePaint = new Paint();Paint textPaint = new Paint();Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lock);int defaultBitmapRadius = defaultBitmap.getWidth() / 2;Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),  R.drawable.indicator_lock_area);int selectedBitmapDiameter = selectedBitmap.getWidth();int selectedBitmapRadius = selectedBitmapDiameter / 2;PointInfo[] points = new PointInfo[9];PointInfo startPoint = null;int width, height;int moveX, moveY;boolean isUp = false;Context cxt;StringBuffer lockString = new StringBuffer();public NinePointLineView(Context context) {super(context);cxt = context;
//		this.setBackgroundColor(Color.WHITE);//设置整个背景initPaint();}public NinePointLineView(Context context, AttributeSet attrs) {super(context, attrs);
//		this.setBackgroundColor(Color.WHITE);//设置整个九宫格的背景initPaint();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// 解析测量规格中的模式和大小int widthMode = MeasureSpec.getMode(widthMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);// 根据需要计算视图的宽度和高度if (widthMode == MeasureSpec.EXACTLY) {// 如果宽度是精确值,则使用它width = widthSize;} else {// 否则,根据内容计算宽度width = 400;}Log.e("NinePointLine", "  heightMode="+heightMode );width = widthSize > 600 ? widthSize : 600;height = heightSize > 600 ? heightSize : 600;//限制最小区域防止出错Log.e("NinePointLine", "onMeasure: Line 53 and width="+width+" and height="+height );if (width != 0 && height != 0) {initPoints(points);}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);}private int startX = 0, startY = 0;@Overrideprotected void onDraw(Canvas canvas) {//canvas.drawText("passwd:" + lockString, 0, 40, textPaint);if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) {drawLine(canvas, startX, startY, moveX, moveY);}drawNinePoint(canvas);super.onDraw(canvas);}@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean flag = true;if (isUp) {finishDraw();flag = false;} else {handlingEvent(event);flag = true;}return flag;}private void handlingEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_MOVE:moveX = (int) event.getX();moveY = (int) event.getY();for (PointInfo temp : points) {if (temp.isInMyPlace(moveX, moveY) && temp.isSelected() == false) {temp.setSelected(true);startX = temp.getCenterX();startY = temp.getCenterY();int len = lockString.length();if (len != 0) {int preId = lockString.charAt(len - 1) - 48;points[preId].setNextId(temp.getId());}lockString.append(temp.getId());break;}}invalidate(0, height - width, width, height);break;case MotionEvent.ACTION_DOWN:int downX = (int) event.getX();int downY = (int) event.getY();for (PointInfo temp : points) {if (temp.isInMyPlace(downX, downY)) {temp.setSelected(true);startPoint = temp;startX = temp.getCenterX();startY = temp.getCenterY();lockString.append(temp.getId());break;}}invalidate(0, height - width, width, height);break;case MotionEvent.ACTION_UP:startX = startY = moveX = moveY = 0;isUp = true;invalidate();savePwd();break;default:break;}}private void finishDraw() {for (PointInfo temp : points) {temp.setSelected(false);temp.setNextId(temp.getId());}lockString.delete(0, lockString.length());isUp = false;invalidate();}private void initPoints(PointInfo[] points) {int len = points.length;int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4;int seletedX = seletedSpacing;int seletedY = height - width + seletedSpacing;int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius;int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius;for (int i = 0; i < len; i++) {if (i == 3 || i == 6) {seletedX = seletedSpacing;seletedY += selectedBitmapDiameter + seletedSpacing;defaultX = seletedX + selectedBitmapRadius- defaultBitmapRadius;defaultY += selectedBitmapDiameter + seletedSpacing;}points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY);seletedX += selectedBitmapDiameter + seletedSpacing;defaultX += selectedBitmapDiameter + seletedSpacing;}}private void initPaint() {Log.e("NinePointLine", "initPaint: 161" );initLinePaint(linePaint);initTextPaint(textPaint);initWhiteLinePaint(whiteLinePaint);}/*** @param paint*/private void initTextPaint(Paint paint) {textPaint.setTextSize(30);textPaint.setAntiAlias(true);textPaint.setTypeface(Typeface.MONOSPACE);}/*** @param paint*/private void initLinePaint(Paint paint) {Log.e("NinePointLine", "initLinePaint: 178" );paint.setColor(Color.GRAY);paint.setStrokeWidth(30);//设置两个点之间的线的的宽度paint.setAntiAlias(true);paint.setStrokeCap(Cap.ROUND);}/*** @param paint*/private void initWhiteLinePaint(Paint paint) {paint.setColor(Color.WHITE);paint.setStrokeWidth(20);//设置两个点之间的线的宽度paint.setAntiAlias(true);paint.setStrokeCap(Cap.ROUND);}/**** @param canvas*/private void drawNinePoint(Canvas canvas) {if (startPoint != null) {drawEachLine(canvas, startPoint);}for (PointInfo pointInfo : points) {if (pointInfo != null) {if (pointInfo.isSelected()) {canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),pointInfo.getSeletedY(), null);}canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(),pointInfo.getDefaultY(), null);}}}/*** @param canvas* @param point*/private void drawEachLine(Canvas canvas, PointInfo point) {if (point.hasNextId()) {int n = point.getNextId();drawLine(canvas, point.getCenterX(), point.getCenterY(),points[n].getCenterX(), points[n].getCenterY());drawEachLine(canvas, points[n]);}}/**** @param canvas* @param startX* @param startY* @param stopX* @param stopY*/private void drawLine(Canvas canvas, float startX, float startY,float stopX, float stopY) {canvas.drawLine(startX, startY, stopX, stopY, linePaint);canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint);}/*** @author zkwlx**/private class PointInfo {private int id;private int nextId;private boolean selected;private int defaultX;private int defaultY;private int seletedX;private int seletedY;public PointInfo(int id, int defaultX, int defaultY, int seletedX,int seletedY) {this.id = id;this.nextId = id;this.defaultX = defaultX;this.defaultY = defaultY;this.seletedX = seletedX;this.seletedY = seletedY;}public boolean isSelected() {return selected;}public void setSelected(boolean selected) {this.selected = selected;}public int getId() {return id;}public int getDefaultX() {return defaultX;}public int getDefaultY() {return defaultY;}public int getSeletedX() {return seletedX;}public int getSeletedY() {return seletedY;}public int getCenterX() {return seletedX + selectedBitmapRadius;}public int getCenterY() {return seletedY + selectedBitmapRadius;}public boolean hasNextId() {return nextId != id;}public int getNextId() {return nextId;}public void setNextId(int nextId) {this.nextId = nextId;}/*** @param x* @param y*/public boolean isInMyPlace(int x, int y) {boolean inX = x > seletedX&& x < (seletedX + selectedBitmapDiameter);boolean inY = y > seletedY&& y < (seletedY + selectedBitmapDiameter);return (inX && inY);}}public String getPwd() {//获取本次的密码return lockString.toString();}/*** 作用:保存密码并且判断界面的跳转* */public void savePwd(){Intent intent = new Intent();SharedPreferences shareDate = cxt.getSharedPreferences("GUE_PWD", MODE_PRIVATE);boolean isSetFirst = shareDate.getBoolean("IS_SET_FIRST", false);if(isSetFirst){//如果第一次已经设置密码,验证第二次和第一次是否一致String pwd = this.getPwd();String first_pwd = shareDate.getString("FIRST_PWD", "NO HAVE PWD");if(pwd.equals(first_pwd)){//第二次密码和第一次密码一样   设置成功shareDate.edit().clear().commit();shareDate.edit().putBoolean("IS_SET", true).commit();shareDate.edit().putString("GUE_PWD", pwd).commit();intent.setClass(cxt, SetPwdResActivity.class);}else{//第二次输入的密码和第一次输入的密码不一致shareDate.edit().putBoolean("SECOND_ERROR", true).commit();intent.setClass(cxt, MainActivity.class);}}else{//第一次设置手势密码shareDate.edit().clear().commit();shareDate.edit().putString("FIRST_PWD", this.getPwd()).commit();shareDate.edit().putBoolean("IS_SET_FIRST", true).commit();intent.setClass(cxt, MainActivity.class);}cxt.startActivity(intent);((Activity)cxt).finish();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/474923.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成都力寰璨泓科技有限公司抖音小店购物新体验

在数字化时代&#xff0c;网购已成为人们生活中不可或缺的一部分。随着抖音等短视频平台的兴起&#xff0c;越来越多的消费者选择在抖音小店购物。成都力寰璨泓科技有限公司抖音小店&#xff0c;作为新兴的电商力量&#xff0c;凭借其可靠的品质和服务&#xff0c;正逐渐成为消…

去测试化真的可行吗?

当前业界对于软件测试和质量相关的讨论非常广泛&#xff0c;各种不同的声音此起彼伏。其中包括质疑测试人员的必要性、去测试人员化、强调测试技术化和工程化、探讨测试与质量的协同作用、讨论敏捷测试、持续测试以及全程自动化测试等等。 这些讨论表明&#xff0c;测试工作和…

23年秋招结束,同学们陆陆续续拿到心仪的offer!24年秋招出发!

续接上次上岸同学的分享&#xff1a;还在担心秋招吗&#xff1f;看看24届已上岸同学的经验分享&#xff01; 秋招的时间过程相同&#xff0c;但经历却各不相同。学历、专业似乎都影响着同学们的面试经历和感受。校招的面试毫无疑问学历的加持是巨大的优势&#xff0c;学历好会…

秒懂百科,C++如此简单丨第二十一天:栈和队列

目录 前言 Everyday English 栈&#xff08;Stack&#xff09; 图文解释 实现添加删除元素 实现查看清空栈 完整代码 运行示例 栈的选择题 队列&#xff08;Queue&#xff09; 图文解释 队列的基本用法 完整代码 运行结果 队列的好处 结尾 前言 今天我们将…

六、Spring/Spring Boot整合ActiveMQ

Spring/Spring Boot整合ActiveMQ 一、Spring整合ActiveMQ1.pom.xml2.Queue - 队列2.1 applicationContext.xml2.2 生产者2.3 消费者 3.Topic - 主题3.1 applicationContext.xml3.2 生产者3.3 消费者 4.消费者 - 监听器4.1 编写监听器类4.2 配置监听器4.3 生产者消费者一体 二、…

国外高防服务器需要注意哪些方面

随着互联网的快速发展&#xff0c;网络安全问题日益突出&#xff0c;高防服务器逐渐成为企业和个人用户的首选。然而&#xff0c;在选择和使用国外高防服务器时&#xff0c;需要注意以下几个方面&#xff0c;以确保安全和稳定。 一、防御能力 首先&#xff0c;需要考虑国外高防…

可视化低代码表单设计器

JNPF 表单设计器是一款在线可视化表单建模工具&#xff0c;基于VueSpringboot技术开发&#xff0c;具有组件丰富、操作简单、所见即所得等特性&#xff0c;既能够设计普通的数据录入表单&#xff0c;也能够配合流程设计出各类审批流转表单。 应用地址&#xff1a;https://www.j…

项目第一次git commit后如何撤销

问题描述&#xff1a; # 1. 新建gitcode目录&#xff0c;然后在目录下 git init# 2. 用idea打开目录后&#xff0c;新建.gitignore文件后 git add .git commit -m "init project"git log# 3. 就出现如下图情况目的&#xff1a;向撤销该次代码提交 # 仅撤销 git com…

8.8 矢量图层点要素点聚合(Point cluster)使用

文章目录 前言点聚合&#xff08;Point cluster&#xff09;QGis代码实现 总结 前言 本章介绍如何使用点聚合&#xff08;Point cluster&#xff09;说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 点聚合&#xff08;Point cluster&#xff09; 点要素过…

扫描电子显微镜(SEM)样品制备要求与方法解析

扫描电子显微镜&#xff08;Scanning Electron Microscope&#xff0c;简称SEM&#xff09;是一种强大的分析工具&#xff0c;广泛应用于材料科学、生物学、医学、半导体材料和化学化工等领域。SEM能够提供高分辨率的表面形貌图像&#xff0c;因此样品制备成为获取准确、清晰图…

字节8年经验之谈 —— 详解python自动化单元测试!

1. 前言 说实话&#xff0c;除了测试要求&#xff0c;我实在不知道写单元测试有什么意义&#xff0c;一个函数50行代码&#xff0c;有多种参数组合&#xff0c;为了测试这些条件&#xff0c;需要编写测试用例&#xff0c;写完的测试用例比需要测试的函数还长。也就是说&#x…

优思学院|有关Cp、Cpk与缺陷率的说法哪一个正确?

有关Cp、Cpk和缺陷率&#xff0c;一直都是六西格玛、质量管理中一个经常使用&#xff0c;又经常令人困域的概念&#xff0c;今天&#xff0c;我们来讨论一条六西格玛的考试题目&#xff0c;看看我们对Cp、Cpk的理解是否正确。题目是这样的&#xff1a; 问题&#xff1a;对于正…