图案解锁

  • 界面设计
  • 实现控件点亮
  • 点亮控件抬手后消失
  • 完整代码

这篇写的是大致思路,如果想深入写一下的朋友可以看这个视频.

这次图案解锁我们用的是图片资源,不是绘制的,也就是说不能出现那种连线跟着手指变化的样子。
这里是这次需要使用的图片资源,提取码:nvg2

界面设计

  1. 将图片资源拖进drawable中
  2. 设置界面布局 可以看看视频,从2:11分开始.
    设置好就是下面这个样子

实现控件点亮

  1. 实现触碰某个按钮就点亮这个按钮
    这里涉及到对
    屏幕坐标的理解
    我们来分析一下,如何判断到这个按钮该被点亮了:
    手指的触碰点落到了按钮所在的区域中,这个按钮就应该被点亮,那么如何判断触碰点落在了按钮所在的区域,可以参考这篇文章


到这里就实现了点击按钮后按钮变亮,接下来该实现点亮两个点后其中的线就连起来

  1. 点亮按钮的同时点亮连线
    那么我们如何知道此时该点亮连线呐:可以通过判断当前按钮被点亮时 有没有 在这个按钮之前被点亮的按钮,如果有则说明这个线是时候被点亮了,如果没有,则不该点亮。

点亮控件抬手后消失

抬手后 被点亮的按钮和线都消失
当我们按下屏幕并滑动的时候按钮和线都被点亮,那我们抬起手来这些按钮和线就该消失。
我们可以用一个数组记录每个被点亮的控件(按钮和线),当我们抬手时就可以将其设为隐藏

完整代码

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——图案解锁相关推荐

  1. Android中图案解锁的设计原理和实现过程

    Android中图案解锁 首先要理解图案的实现原理,上一张图:       由上图,可以看出,图案中手势的记录是1-9或0-8的,保存的顺序就是密码,当然有些是可以重复的,为了安全,肯定不能直接存原顺 ...

  2. android开发图案解锁,Android开发中图案解锁完整版

    学习目的 通过学习Android里面的onTouchEvent方法对上篇的图案解锁进行完善,调用touch方法实现触控功能和tag值得用法. 先关技术.及其使用 1.重写onTouchEvent方法 ...

  3. android开发图案解锁,Android_开发_Day23_图案解锁(下)

    Android_开发Day23图案解锁 目的: 综合运用Java以及C语言的思想来解决问题 技术: <1> onTouchEvent: onTouchEvent方法是当屏幕被触摸时系统调用 ...

  4. android 九宫格图案解锁

    项目可能的需要,自己尝试写了一个九宫格解锁,在此记录,以作笔记. 先上效果图                     关于项目的分析,见下图 width 九宫格控件的宽度,height 九宫格的控件的 ...

  5. android 图案解锁密码,关于Android手机图案解锁总密码数,个人写的一个递归版求解...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 没有注释,测试运行一下就行了,大部分人还是能看懂的. import java.util.Vector; public class TestLock { p ...

  6. 2021-10-14 Android app 九宫图案解锁实现

    一.效果图如下.  二.废话不多说,直接read the fuck code. 1.代码预览 2.src\main\java\com\giada\ninelock\MainActivity.java ...

  7. 9宫格解锁 android_android开发图案解锁学习记录一(九宫格的绘制)

    图案解锁的原理: 九宫格解锁故名思议就是要有九个宫格:然后宫格间进行连线. 首先我们要先绘制九个点(宫格),确定位置,然后绘制不同的图案. 图案分为不同的状态:正常的状态,按下时的状态和错误的状态 当 ...

  8. 快给你的app上锁吧(android图案解锁)

    序言:前两天因为项目的原因,去做了一下仿ios的数字解锁功能,然后写了那篇快给你的app上锁吧(android数字解锁),后来想到应用中常见的还有另外一种解锁就是绘制图案解锁,这两种解锁的布局看起来是 ...

  9. android 图案解锁忘记了,安卓手机忘记图形解锁、锁屏密码的解决方法

    Android 手机的图形解锁倒是真的好用了,主要是方便新颖,并且便于记忆,自从有了图形解锁,很多人都不再使用密码屏幕锁了,图形解锁倒是好玩,但是经常换来换去的话就会造成一时间想不起哪个图形解锁图案才 ...

最新文章

  1. 生成树协议,stp使用哪两个参数来选举根网桥?
  2. 解决Java Web对Linux服务器不能上传文件的难题
  3. 网页变成灰色,对重大事件表示哀悼
  4. Android找工作系列之自定义View
  5. usb一转多 树莓派zero_树莓派 Zero USB/以太网方式连接配置教程
  6. FFmpeg视频编解码库,无法解析的外部符号、找不到inttypes.h文件的问题
  7. 常见的三个网络协议的区别:TCP/IP、NetBEUI、IPX/SPX
  8. python的题库_python题库-Python,题库
  9. hbase二级索引解决方案
  10. MyBatis 里面如何配置log4j
  11. 腾讯课堂课程汇总 CourseList(1000000-1001000)
  12. 如果你恨一个人,就让他去接手别人的代码
  13. 公司银企对账怎么操作
  14. IDEA 设置单行注释格式化时不换行
  15. 压力测试是什么?为什么要压力测试?怎么使用压力测试?
  16. 缓存(cache、Redis)
  17. 区块链主流开源技术体系介绍(转)
  18. 加载繁体字体时遇到的问题
  19. AJAX框架眼镜穿搭夏天,20套夏天穿搭!我帮你整理出来了
  20. 一个进入保护模式加载引导程序的BOOTLOADER

热门文章

  1. 第三周作业1(1)嘎嘎嘎
  2. SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)
  3. 【2020大数据应用赛试题】Spark分析处理
  4. 东北大学OJ-1551: 实验4-13:求四个数中的最大值
  5. Excel删除空白行(亲自实践)
  6. python复制100个我爱你_520个我爱你可复制粘贴
  7. zabbix监控设置微信报警
  8. 小米游戏本的性价比不如联想游戏本
  9. Mysql面试题之三大范式
  10. 头像 这样就是人生11个接吻的好处