Android studio——图案解锁
图案解锁
- 界面设计
- 实现控件点亮
- 点亮控件抬手后消失
- 完整代码
这篇写的是大致思路,如果想深入写一下的朋友可以看这个视频.
这次图案解锁我们用的是图片资源,不是绘制的,也就是说不能出现那种连线跟着手指变化的样子。
这里是这次需要使用的图片资源,提取码:nvg2
界面设计
- 将图片资源拖进drawable中
- 设置界面布局 可以看看视频,从2:11分开始.
设置好就是下面这个样子
实现控件点亮
- 实现触碰某个按钮就点亮这个按钮
这里涉及到对
屏幕坐标的理解
我们来分析一下,如何判断到这个按钮该被点亮了:
当手指的触碰点落到了按钮所在的区域中,这个按钮就应该被点亮,那么如何判断触碰点落在了按钮所在的区域,可以参考这篇文章
到这里就实现了点击按钮后按钮变亮,接下来该实现点亮两个点后其中的线就连起来
- 点亮按钮的同时点亮连线
那么我们如何知道此时该点亮连线呐:可以通过判断当前按钮被点亮时 有没有 在这个按钮之前被点亮的按钮,如果有则说明这个线是时候被点亮了,如果没有,则不该点亮。
点亮控件抬手后消失
抬手后 被点亮的按钮和线都消失
当我们按下屏幕并滑动的时候按钮和线都被点亮,那我们抬起手来这些按钮和线就该消失。
我们可以用一个数组记录每个被点亮的控件(按钮和线),当我们抬手时就可以将其设为隐藏。
完整代码
class MainActivity : AppCompatActivity() {//被点亮的Viewprivate var alreadyViews = mutableListOf<View>()private var lastDot:View? = nullprivate lateinit var binding: ActivityMainBinding//记录输入的密码private val pwd = StringBuilder()//保存点9个private val dotsArray:Array<ImageView> by lazy {arrayOf(binding.dot1,binding.dot2,binding.dot3,binding.dot4,binding.dot5,binding.dot6,binding.dot7,binding.dot8,binding.dot9)}//保存所有的线段的tag值private val lineTagsArray = arrayOf(12,23,45,56,78,79,//横线14,25,36,47,58,69,//竖线24,35,57,68,15,26,48,59//斜线)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)}override fun onTouchEvent(event: MotionEvent?): Boolean {//判断事件的类型when(event?.action){MotionEvent.ACTION_DOWN ->{val dotView = checkTouchView(event)if (dotView != null){//点亮这个点dotView.visibility = View.VISIBLE//记录这个点lastDot = dotView//添加到被点亮的视图alreadyViews.add(dotView)//记录密码pwd.append(dotView.tag)}}MotionEvent.ACTION_MOVE -> {val dotView = checkTouchView(event)if (dotView != null) {if (dotView.visibility == View.INVISIBLE) {if (lastDot == null) {//点亮这个点dotView.visibility = View.VISIBLE//记录这个点lastDot = dotView//记录密码pwd.append(dotView.tag)} else {//获取上一个点的tag值val perTag = (lastDot?.tag as String).toInt()val currentTag = (dotView?.tag as String).toInt()val lineTag = if (perTag < currentTag) {(perTag * 10 + currentTag).toString()} else {(currentTag*10 + perTag).toString()}//判断val lineTagABS = abs(perTag - currentTag)if (lineTagABS <= 4) {//有路径则获取tag对应的视图val lineView = binding.dotContainer.findViewWithTag<ImageView>(lineTag)//点亮线lineView.visibility = View.VISIBLE//点亮点dotView.visibility = View.VISIBLElastDot = dotView//记录密码pwd.append(dotView.tag)//添加到被点亮的视图alreadyViews.add(dotView)alreadyViews.add(lineView)}}}}}MotionEvent.ACTION_UP ->{//隐藏alreadyViews.forEach {it.visibility = View.INVISIBLE}alreadyViews.clear()//SharedPreferencelastDot = nullLog.v("pharaoh","$pwd")}}return true}//判断触摸点是否在某个dot区域内private fun checkTouchView(event: MotionEvent):View?{//获取触摸点在容器中的坐标val point = getTouchPoint(event)//循环遍历保存九个点的数组dotsArray.forEach {//获取当前视图的Rectval dotRect = toRect(it)//判断触摸点是否在这个矩形区域内val result = dotRect.contains(point)if (result){return it}}return null}//将某个视图的坐标转换为Rectprivate fun toRect(dot: ImageView):Rect{return Rect(dot.x.toInt(),dot.y.toInt(),(dot.x + dot.width).toInt(),(dot.y + dot.height).toInt())}//计算触摸点相对于父容器的坐标private fun getTouchPoint(event: MotionEvent):Point{//相对于屏幕的高度 - 顶部bar的高度 - 容器和内容区域顶部的高度val y = event.y - getBarHeight() - binding.dotContainer.yval touchPoint = Point()touchPoint.x = event.x.toInt()touchPoint.y = y.toInt()return touchPoint}//获取顶部bar的高度private fun getBarHeight():Int{super.onRestart()//计算屏幕高度val metrics = DisplayMetrics()windowManager.defaultDisplay.getMetrics(metrics)val allHeight = metrics.heightPixels//内容的高度val rect = Rect()val content = window.findViewById<ViewGroup>(Window.ID_ANDROID_CONTENT)content.getDrawingRect(rect)//底部的高度//val resourceId = resources.getIdentifier("navigation_bar_height","dimen","android")//val navBarHeight = resources.getDimensionPixelSize(resourceId)val barHeight = allHeight - rect.height()return barHeight}
}
Android studio——图案解锁相关推荐
- Android中图案解锁的设计原理和实现过程
Android中图案解锁 首先要理解图案的实现原理,上一张图: 由上图,可以看出,图案中手势的记录是1-9或0-8的,保存的顺序就是密码,当然有些是可以重复的,为了安全,肯定不能直接存原顺 ...
- android开发图案解锁,Android开发中图案解锁完整版
学习目的 通过学习Android里面的onTouchEvent方法对上篇的图案解锁进行完善,调用touch方法实现触控功能和tag值得用法. 先关技术.及其使用 1.重写onTouchEvent方法 ...
- android开发图案解锁,Android_开发_Day23_图案解锁(下)
Android_开发Day23图案解锁 目的: 综合运用Java以及C语言的思想来解决问题 技术: <1> onTouchEvent: onTouchEvent方法是当屏幕被触摸时系统调用 ...
- android 九宫格图案解锁
项目可能的需要,自己尝试写了一个九宫格解锁,在此记录,以作笔记. 先上效果图 关于项目的分析,见下图 width 九宫格控件的宽度,height 九宫格的控件的 ...
- android 图案解锁密码,关于Android手机图案解锁总密码数,个人写的一个递归版求解...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 没有注释,测试运行一下就行了,大部分人还是能看懂的. import java.util.Vector; public class TestLock { p ...
- 2021-10-14 Android app 九宫图案解锁实现
一.效果图如下. 二.废话不多说,直接read the fuck code. 1.代码预览 2.src\main\java\com\giada\ninelock\MainActivity.java ...
- 9宫格解锁 android_android开发图案解锁学习记录一(九宫格的绘制)
图案解锁的原理: 九宫格解锁故名思议就是要有九个宫格:然后宫格间进行连线. 首先我们要先绘制九个点(宫格),确定位置,然后绘制不同的图案. 图案分为不同的状态:正常的状态,按下时的状态和错误的状态 当 ...
- 快给你的app上锁吧(android图案解锁)
序言:前两天因为项目的原因,去做了一下仿ios的数字解锁功能,然后写了那篇快给你的app上锁吧(android数字解锁),后来想到应用中常见的还有另外一种解锁就是绘制图案解锁,这两种解锁的布局看起来是 ...
- android 图案解锁忘记了,安卓手机忘记图形解锁、锁屏密码的解决方法
Android 手机的图形解锁倒是真的好用了,主要是方便新颖,并且便于记忆,自从有了图形解锁,很多人都不再使用密码屏幕锁了,图形解锁倒是好玩,但是经常换来换去的话就会造成一时间想不起哪个图形解锁图案才 ...
最新文章
- 生成树协议,stp使用哪两个参数来选举根网桥?
- 解决Java Web对Linux服务器不能上传文件的难题
- 网页变成灰色,对重大事件表示哀悼
- Android找工作系列之自定义View
- usb一转多 树莓派zero_树莓派 Zero USB/以太网方式连接配置教程
- FFmpeg视频编解码库,无法解析的外部符号、找不到inttypes.h文件的问题
- 常见的三个网络协议的区别:TCP/IP、NetBEUI、IPX/SPX
- python的题库_python题库-Python,题库
- hbase二级索引解决方案
- MyBatis 里面如何配置log4j
- 腾讯课堂课程汇总 CourseList(1000000-1001000)
- 如果你恨一个人,就让他去接手别人的代码
- 公司银企对账怎么操作
- IDEA 设置单行注释格式化时不换行
- 压力测试是什么?为什么要压力测试?怎么使用压力测试?
- 缓存(cache、Redis)
- 区块链主流开源技术体系介绍(转)
- 加载繁体字体时遇到的问题
- AJAX框架眼镜穿搭夏天,20套夏天穿搭!我帮你整理出来了
- 一个进入保护模式加载引导程序的BOOTLOADER
热门文章
- 第三周作业1(1)嘎嘎嘎
- SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)
- 【2020大数据应用赛试题】Spark分析处理
- 东北大学OJ-1551: 实验4-13:求四个数中的最大值
- Excel删除空白行(亲自实践)
- python复制100个我爱你_520个我爱你可复制粘贴
- zabbix监控设置微信报警
- 小米游戏本的性价比不如联想游戏本
- Mysql面试题之三大范式
- 头像 这样就是人生11个接吻的好处