在进行功能模块开发时,必然会有功能需求,但是在此之前一定尽量的去了解业务需求和用户需求。以屏幕锁定功能为例,属于小模块功能,业务需求较为宏观,一般在项目落地之初,业务需求会随之明确,这里主要分析用户需求。有的时候功能需求和用户需求会非常明确,明确到我们只需要按照分析文档照本宣科地实现功能就行,但是有的时候我们也会遇到不知所谓的要求,不论是那种情况,我们在需求分析的时候,一定要多转换身份来多方位思考,以用户的角度来代入他的使用场景,寻找产品解决的痛点,分析用户的真正需求。为什么我说真正的需求呢?我认为用户说的可能未必是他们想要的,可能是基于自身角色说出一些并非真正需求的话。比如:索尼在发布新款音响时,想了解用户真正喜欢的是那款颜色,在调研的时候,被邀请的测试者大部分回答黄色,但是在结束时,主办方提供免费的音响作为礼物,但是大部分测试者拿走的却是黑色。

 屏幕锁定用户人群:老师使用场景:学校功能的作用:预防学生操作功能需求:设置背景图片,设置数字密码,视觉体验佳

针对以上需求,必然需要用到悬浮窗,而且悬浮窗的TYPE级别要很高,且提供选择图库让用户选择图片设置背景,使用EditText来满足设置密码,考虑用户体验,自由使用的前提下,在进入锁定界面时,逻辑判断应该允许客户在不设置背景图片和密码的情况下进入锁屏界面,在操作体验佳的要求下,可自定义绘制一个半透明圆,让用户拖动锁到圆的范围外的操作来解锁的设计。基本就这些,先上成品效果图。

功能非常简单,只描述自定义解锁View,这个功能其实也很简单,只是判断手是否按在锁上,拖动时,判断锁是否有超出圆的范围,如果超出,有设置密码的话就弹出密码解锁界面,没有就直接解锁。通过求平方根获得移动的范围的距离d,如果d>r代表移动的距离已经超出半径可以解锁。

首先在layout中确定自定义View的宽高和中心坐标点,iconX、iconY是锁图标的左上角坐标,centerRectX、centerRectY是锁图标的中心坐标。

 @Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);mWidth = right - left;mHeight = bottom - top;centerX = mWidth / 2;centerY = mHeight / 2;iconX = centerX - iconBitmap.getWidth() / 2;iconY = centerY - iconBitmap.getHeight() / 2 - 30;centerRectX = iconX + iconBitmap.getWidth() / 2;centerRectY = iconY + iconBitmap.getHeight() / 2;centerPintF.set(centerX, centerY);}

在手势响应按下事件时,应该判断当前坐标是否处于锁图标的范围

//判断一个点是否在矩形内部public boolean isInsider(double x, double y) {int x1 = iconX;int y1 = iconY;int x4 = iconX + iconBitmap.getWidth();int y4 = iconY + iconBitmap.getHeight();//默认:1点在左上,4点在右下if (x < x1) {//在矩形左侧return false;}if (y < y1) {//在矩形上侧return false;}if (x > x4) {//在矩形右侧return false;}if (y > y4) {//在矩形下侧return false;}return true;}

如果是按在锁上,在移动的时候,锁也需要跟着我们的手指移动,另外在移动的时候,需要注意下X轴分左移和右移,Y轴分上移和下移,在这里我们的坐标点获取需要另作计算,在移动的时候如果超出范围就通过接口回调通知。同时需要注意的时,在抬起事件中,如果没有超出反应,锁需要重绘返回中心位置。

 @Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:int x = (int) event.getX();int y = (int) event.getY();isInside = isInsider(x, y);break;case MotionEvent.ACTION_MOVE:if (isInside && iconBitmap != null) {int moveX = (int) event.getX();int moveY = (int) event.getY();if (moveX < centerRectX) {pointF = new PointF(moveX - iconBitmap.getWidth() / 2, moveY);}if (moveX > centerRectX) {pointF = new PointF(moveX + iconBitmap.getWidth() / 2, moveY);}if (moveY < centerRectY) {pointF = new PointF(moveX, moveY - iconBitmap.getHeight() / 2);}if (moveY > centerRectY) {pointF = new PointF(moveX, moveY + iconBitmap.getHeight() / 2);}iconX = moveX - iconBitmap.getWidth() / 2;iconY = moveY - iconBitmap.getHeight() / 2;centerRectX = moveX;centerRectY = moveY;if (!isPointInCircle(pointF, centerPintF, centerX)) {if (mListener != null) {mListener.onUnlockSuccess();recycleBitmap();}}invalidate();}break;case MotionEvent.ACTION_UP:if (isInside) {int upX = (int) event.getX();int upY = (int) event.getY();if (isPointInCircle(new PointF(upX, upY), centerPintF, centerX)) {iconX = centerX - iconBitmap.getWidth() / 2;iconY = centerY - iconBitmap.getHeight() / 2 - 30;invalidate();}}break;}return true;}
    /*** 判断点是否在圆内** @param pointF 待确定点* @param circle 圆心* @param radius 半径* @return true在圆内*/private boolean isPointInCircle(PointF pointF, PointF circle, float radius) {return Math.pow((pointF.x - circle.x), 2) + Math.pow((pointF.y - circle.y), 2) <= Math.pow(radius, 2);}

请注意:Android6.0及以上请自行添加动态申请悬浮窗权限
项目代码
谢谢观看!

Android 屏幕锁定相关推荐

  1. Android屏幕锁定详解(一)

    相信手机屏幕的锁定大伙熟悉吧?今天小马就找个时间写下对屏幕锁的控制及学习,希望能帮助朋友们对屏幕锁更加了解,以备不时之用,九宫格 PIN密码 密码锁屏等的小马会有屏幕锁二中详细介绍,大家看来看这篇简单 ...

  2. Rexsee API介绍:Android屏幕锁定,Keyguard函数与扩展源码

    Android锁屏时会先调用onPause():解锁时调用onResume,读入保存的应用程序的资源.如果运行程序时已经锁屏,应用程序会先调用onCreate(),然后onResume(),再则onP ...

  3. Rexsee API介绍:Android屏幕锁定Keyguard

    Android锁屏时会先调用onPause():解锁时调用onResume,读入保存的应用程序的资源.如果运行程序时已经锁屏,应用程序会先调用onCreate(),然后onResume(),再则onP ...

  4. android系统锁屏锁怎么解决方法,忘了图案锁?这是你如何解锁Android模式锁定屏幕!...

    第2部分:如何使用Android锁屏移除传递忘记模式锁定? "忘记模式"功能的一个主要缺点是它不适用于新的Android设备.由于那里的大多数设备都已更新,因此该技术已经过时.因此 ...

  5. android手机可以设置屏幕锁定,安卓手机屏幕锁设置方法(九个点图案)

    这里以三星S5368手机屏幕锁为例 随着三星S5368手机系统功能愈来愈完善,性能愈来愈强劲,越来越多的三星S5368用户们都喜欢把一些重要的信息甚至隐私放在三星S5368手机里面,但是这就有可能会让 ...

  6. 动态注册广播接收者,屏幕锁定Android

    动态注册广播接收者,屏幕锁定Android 1.AndroidManifest.xml <?xml version="1.0" encoding="utf-8&qu ...

  7. android手机可以设置屏幕锁定,Android手机屏幕锁定设置方法(九个点图案)

    这是三星S5368手机屏幕锁的示例 随着三星S5368手机系统的功能越来越完善,性能越来越强. 越来越多的三星S5368用户喜欢在三星S5368手机中添加一些重要信息甚至是隐私,但是这种方式可能会被其 ...

  8. android设置不锁屏adb,如何通过ADB锁定Android屏幕?

    如何通过ADB锁定Android屏幕? 有没有办法通过ADB锁定Android屏幕? 我找到了将显示锁定在apk中的方法,但是我想通过ADB从PC锁定屏幕,以模拟显示超时,而不必等待超时. 是否有可能 ...

  9. Android系统工作资料被锁定,您需要知道的有关安卓屏幕锁定设置的所有内容

    解锁Android的不同方法 首先看一下如何从android锁屏设置启用锁屏功能的过程.要达到锁定屏幕设置android,你必须遵循以下路径: 选项 - 安全 - 屏幕锁定 - 选择屏幕锁定. 现在看 ...

最新文章

  1. 当最懂 5G 的中国移动遇见云,移动云专题赛正式启动!
  2. 什么样的数学问题可以“下金蛋”?
  3. matlab求adc信号的信噪比,关于ADC的信噪比 - pengyouxiaohui的日志 - EETOP 创芯网论坛 (原名:电子顶级开发网) -...
  4. python输出乘法口诀-python以不同方式打印输出九九乘法表
  5. Lesson 16.6Lesson 16.6 复现经典架构:LeNet5 复现经典架构 (2):AlexNet
  6. BNUOJ 52325 Increasing or Decreasing 数位dp
  7. bootstrap清除拟态框内添加新HTML再打开时会有缓存现象
  8. Windows 11 来了!无缝支持安卓 App界面却像极了macOS
  9. 清华2018顶级数据团队建设全景报告发布:Python最受欢迎,C语言含金量最高
  10. Oblivion Sound Lab Hex Drum Mac - 虚拟鼓声乐器
  11. LeetCode:81. Search in Rotated Sorted Array II
  12. Shell下syntax error: operand expected (error token is “-”)
  13. 海康/大华实现web直播和回放,也可以直接对接摄像头
  14. apache+php环境配置
  15. 一个下载视频的小程序
  16. 织梦php环境搭建,织梦建站入门:搭建本地PHP环境图文教程
  17. 专利撰写是什么工作_如何(以及为什么)撰写出色的用户故事
  18. 2021-06-04 Java对象在Hibernate下的4种状态和Session相关方法以及对象识别
  19. Python编程:函数
  20. 英语写作中的一些缩写

热门文章

  1. 服务器搭建青龙面板薅京豆
  2. CSS基础之媒体类型(@media)样式
  3. 如何撰写商业计划书?
  4. 冲击波超压峰值曲线绘制
  5. python 今日头条 微头条_今日头条的入门,其实就是‘微头条’
  6. android ratingbar 点击事件,android – Capture RatingBar点击
  7. 分享|智慧环保-生态文明信息化解决方案(附PDF)
  8. win7打开资源管理器显示计算机而不是库
  9. ssh framework
  10. Swoole 使用WSS协议无法正常连接