1.滑动解锁代码流程图:

流程图

图片资源:https://pan.baidu.com/s/1tkcw0tdxV78mnwHqOtcAGg

提取码:2xsq

2.代码:

xml文件:

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity"

android:id="@+id/root_layout">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:scaleType="fitXY"

android:src="@drawable/main_bg"

tools:layout_editor_absoluteX="66dp"

tools:layout_editor_absoluteY="632dp"

/>

android:id="@+id/opView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/op_bg"

android:layout_centerInParent="true"

/>

android:id="@+id/tv_alert"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="图案解锁"

android:textSize="20sp"

android:textColor="#ffffff"

android:textAlignment="center"

android:layout_alignTop="@id/opView"

android:layout_marginTop="90dp"

/>

界面效果图

MainActivity 文件:

public class MainActivity extends AppCompatActivity{

//定义⼀个数组 保存每个点的控件

ArrayList dotsList;

ArrayList lineTagsList;

ArrayList selectedList;

int tag;

//保存上⼀次被点亮的点的对象

ImageView lastSelectedDot;

//记录滑动的密码

StringBuilder password;

//保存原始密码

String orgPassword;

//保存第⼀次输⼊的密码

String firstPassword;

//提示的⽂本视图

TextView alertTextView;

@Override

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

//判断是否已经显示

if (hasFocus){

//获取容器

RelativeLayout rl = findViewById(R.id.root_layout);

//获取背景视图

ImageView iv = findViewById(R.id.opView);

//获取x 和 y坐标

int x = iv.getLeft();

int y = iv.getTop();

//获取屏幕密度

float scale = getResources().getDisplayMetrics().density;

//创建横线 6条

//12 23

//45 56

//78 89

tag = 12;

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 2; j++) {

//创建⼀个视图⽤于显示线

ImageView lineView = new ImageView(this);

lineView.setBackgroundResource(R.drawable.normal_highlight1);

lineView.setVisibility(View.INVISIBLE);

lineView.setTag(tag);

lineTagsList.add(tag);//保存线的tag值

tag += 11; //同⼀⾏相差11

//创建布局参数

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

params.leftMargin = (int)(x + 46.6*scale) + (int)(99*scale*j);

params.topMargin = (int)(y + 170*scale) + (int)(99*scale*i);

rl.addView(lineView, params);

}

//换⼀⾏ 相差22

tag += 11;

}

//创建竖线 4条

//14 25 36

//47 58 69

tag = 14;

for (int i = 0; i < 2; i++) {

for (int j = 0; j < 3; j++) {

//创建⼀个视图⽤于显示线

ImageView lineView = new ImageView(this);

lineView.setBackgroundResource(R.drawable.normal_highlight2);

lineView.setVisibility(View.INVISIBLE);

lineView.setTag(tag);

lineTagsList.add(tag);//保存线的tag值

tag += 11;

//创建布局参数

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

params.leftMargin = (int)(x + 42*scale) + (int)(99*scale*j);

params.topMargin = (int)(y + 170*scale) + (int)(99*scale*i);

rl.addView(lineView, params);

}

}

//创建斜线

//左斜

// 24 35

// 57 68

// 右斜

// 15 26

// 48 59

tag = 24;

int rTag = 15;

for (int i = 0; i < 2; i++) {

for (int j = 0; j < 2; j++) {

//创建⼀个视图⽤于显示线

ImageView rLineView = new ImageView(this);

rLineView.setTag(rTag);

lineTagsList.add(rTag);//保存线的tag值

rTag += 11;

//设置图⽚

rLineView.setBackgroundResource(R.drawable.normal_highlight3);

//创建布局参数

rLineView.setVisibility(View.INVISIBLE);

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

params.leftMargin = (int)(x + 42*scale) + (int)(99*scale*j);

params.topMargin = (int)(y + 170*scale) + (int)(99*scale*i);

rl.addView(rLineView, params);

ImageView lLineView = new ImageView(this);

lLineView.setTag(tag);

lineTagsList.add(tag);//保存线的tag值

tag += 11;

lLineView.setVisibility(View.INVISIBLE);

lLineView.setBackgroundResource(R.drawable.normal_highlight4);

params.leftMargin = (int)(x + 53.3*scale) + (int)(99*scale*j);

params.topMargin = (int)(y + 170*scale) + (int)(99*scale*i);

rl.addView(lLineView,params);

}

tag += 11;

rTag += 11;

}

//创建9个点

tag = 1;

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 3; j++) {

//创建⽤于显示点的视图

ImageView dotView = new ImageView(this);;

//设置对应的tag值

dotView.setTag(tag);

tag++;

//隐藏视图

dotView.setVisibility(View.INVISIBLE);

//显示对应的图⽚

dotView.setBackgroundResource(R.drawable.selected_dot);

//创建控件的尺⼨

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

params.leftMargin = (int)(x + 35.33*scale) + (int)(98.66*scale*j);

params.topMargin = (int)(y + 162*scale) + (int)(98.66*scale*i);

//将控件添加到容器中

rl.addView(dotView, params);

//将这个控件添加到数组

dotsList.add(dotView);

}

}

}

}

//监听触摸事件

@Override

public boolean onTouchEvent(MotionEvent event) {

//获取事件的类型

int action = event.getAction();

ImageView selected;

float x;

float y;

//判断是什么事件

switch (action){

case MotionEvent.ACTION_DOWN:

//按下

//获取触摸点的坐标

x = event.getX();

y = event.getY();

//判断x y是不是在某个点的范围内

selected = dotOfTouch(x, y);

if (selected != null) {

//点亮

selected.setVisibility(View.VISIBLE);

//记录当前这个点

lastSelectedDot = selected;

//将tag值拼接到密码中

password.append(selected.getTag());

//将点亮的点添加到数组中

selectedList.add(selected);

}

break;

case MotionEvent.ACTION_MOVE:

//移动

//获取触摸点的坐标

x = event.getX();

y = event.getY();

//判断x y是不是在某个点的范围内

selected = dotOfTouch(x, y);

if (selected != null) {

//判断这个点是不是第⼀个点

if (lastSelectedDot == null){

//第⼀个点

selected.setVisibility(View.VISIBLE);

//记录

lastSelectedDot = selected;

//将tag值拼接到密码中

password.append(selected.getTag());

//将点亮的点添加到数组中

selectedList.add(selected);

} else{

//不是第⼀个点

//获取上⼀个点和当前点的tag

int lTag = (Integer) lastSelectedDot.getTag();

int cTag = (Integer) selected.getTag();

//获取两个线的tag值 small * 10 + big

int lineTag = lTag > cTag ? cTag*10+lTag: lTag*10+cTag;

//判断这条线是否存在

if (lineTagsList.contains(lineTag)){

//线存在

//点亮点

selected.setVisibility(View.VISIBLE);

//将tag值拼接到密码中

password.append(selected.getTag());

//点亮这条线

//获取容器对象

RelativeLayout rl = findViewById(R.id.root_layout);

//通过tag查找⼦控件

ImageView iv = rl.findViewWithTag(lineTag);

//点亮线

iv.setVisibility(View.VISIBLE);

//记录这个点

lastSelectedDot = selected;

//将点亮的点添加到数组中

selectedList.add(selected);

//将点亮的线添加到数组中

selectedList.add(iv);

}

}

}

break;

case MotionEvent.ACTION_UP:

//离开

// 1.绘制密码 和原始密码⽐较

// 2.设置密码 第⼀次

// 3.设置密码 第⼆次

if (orgPassword != null){

//有密码了

if (password.toString().equals(orgPassword)){

alertTextView.setText("解锁密码成功");

} else{

alertTextView.setText("解锁密码失败");

}

} else{

//设置密码

//判断是第⼀次还是第⼆次确认密码

if (firstPassword == null){

//设置密码的第⼀次

firstPassword = password.toString();

//提示确认密码

alertTextView.setText("请确认密码图案");

} else{

//第⼆次确认密码

//判断两次是否⼀致

if (firstPassword.equals(password.toString())){

//设置成功

alertTextView.setText("设置密码成功");

//保存密码

SharedPreferences sp = getSharedPreferences("password",0);

SharedPreferences.Editor editor = sp.edit();

editor.putString("pwd",firstPassword);

editor.commit();

} else{

//设置失败

alertTextView.setText("两次密码不⼀致 请重新设置");

firstPassword = null;

}

}

}

clean();

break;

default:

break;

}

return true;

}

//清空

public void clean(){

password.setLength(0);

//隐藏所有选中的视图 点 线

for (ImageView iv:selectedList){

iv.setVisibility(View.INVISIBLE);

}

//清空数组

selectedList.clear();

}

//写⼀个⽅法 处理 判断触摸点是否在某个控件内部

public ImageView dotOfTouch(float x, float y){

//计算状态栏或者标题栏的距离

//遍历数组

for (ImageView dot:dotsList){

//获取这个dot相对于屏幕的x y

int[] loc = new int[2];

dot.getLocationOnScreen(loc);

int dx = loc[0];

int dy = loc[1];

//获取右边的偏移量

int r = dx + dot.getWidth();

//获取最底部的偏移量

int b = dy + dot.getHeight();

//判断这个点是否在这个范围内

if ((x <= r && x >= dx) &&

(y <= b && y >= dy)){

return dot;

}

}

return null;

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//准备好数组 实例化对象

dotsList = new ArrayList<>();

lineTagsList = new ArrayList<>();

password = new StringBuilder();

selectedList = new ArrayList<>();

//获取xml的⽂本控件

alertTextView = findViewById(R.id.tv_alert);

//查找偏好设置⾥⾯是否有保存的密码pwd

SharedPreferences sp = getSharedPreferences("password",MODE_PRIVATE);

//获取pwd对应密码

orgPassword = sp.getString("pwd",null);

if (orgPassword == null){

alertTextView.setText("请设置密码图案");

}else{

alertTextView.setText("请绘制密码图案");

}

}

@Override

protected void onResume() {

super.onResume();

Point p = new Point();

getWindowManager().getDefaultDisplay().getSize(p);

float w = p.x;

float h = p.y;

if (w > h){

System.out.println("横屏");

} else{

System.out.println("竖屏");

}

}

}

注意:按照1-9的顺序给9个点添加tag值。在创建横线、竖线和斜线时,给它们添加两位数的tag值(每条线连接两个点,两个点的tag值小的数组成线tag值的两位,大的组成tag值的个位数)。手指在两个点间滑动时,两个点的tag值组成一个两位数(两个点小的tag值组成十位,大的组成个位),遍历所有的线的tag值,判断是否有与这个两位数相同的tag值,有则点亮该线。

Android滑动解锁功能实现,Android_滑动解锁相关推荐

  1. react 实现移动端横向滑动展示功能 商品展示左右滑动

    先看效果 : .concent { width:100%; .box { white-space:nowrap; // 注释1overflow-x:auto; margin: 0;padding: 0 ...

  2. 安卓程序添加指纹解锁功能

    前言 指纹解锁技术成为当前验证用户信息的重要手段,基本上当前手机都配置了指纹解锁.当开发的APP需要加密验证时可以考虑添加系统指纹解锁功能. 添加指纹解锁功能步骤很简单,大致过程如下: 1 添加权限 ...

  3. android搜索框功能实现_Android实现滑动解锁功能

    说到滑动解锁,就回到了2012~2014年,iPhone4S.5.5S年代,如今准备踏入2020年,这些年国产机崛起,再也不是公交车上都是iPhone4S的场景.本篇来使用ViewDragHelper ...

  4. android 4.4 mtk 默认滑动解锁改为假指纹解锁

    android4.4,客户要求去掉滑动解锁,更改为假指纹触摸方式············ 先看一下kk锁屏界面 想法是直接把滑动解锁图标换成指纹,然后onTouch解锁,要把滑动事件去掉. kk版本K ...

  5. Java+Uiautomator自动化测试 -- 3.实现手机的五种解锁方式(无/滑动/图案/PIN码/密码|)

    首先 先封装下每个解锁方式 package com.秘密xxx.autotest.page.systemui;import android.graphics.Point; import android ...

  6. android 8.0人脸识别,华为终于坐不住了!推送新版EMUI 8.0:新增人脸识别解锁功能!...

    原标题:华为终于坐不住了!推送新版EMUI 8.0:新增人脸识别解锁功能! 近日,华为Mate 10系列终于迎来重磅更新--EMUI 8.0.0.128SP2版本.新版系统新增了万众期待的人脸识别解锁 ...

  7. android 横向滚动图片,Android使用Photoview实现图片左右滑动及缩放功能

    Android使用Photoview实现图片左右滑动及缩放功能 发布时间:2020-10-12 14:51:12 来源:脚本之家 阅读:119 作者:kuaizilanqiu 我想,不管是做什么样的a ...

  8. 动态头像 Android 实现,Android开发中实现一个头像滑动变大变小功能

    Android开发中实现一个头像滑动变大变小功能 发布时间:2020-11-21 16:36:20 来源:亿速云 阅读:74 作者:Leah 这篇文章给大家介绍Android开发中实现一个头像滑动变大 ...

  9. android的手势解锁功能,Android应用开发之Android 5秒学会使用手势解锁功能

    本文将带你了解Android应用开发Android 5秒学会使用手势解锁功能,希望本文对大家学Android有所帮助. Android手势解锁 本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点.路 ...

最新文章

  1. c语言四则运算实验报告,c语言四则运算实验报告.doc
  2. 【正一专栏】从中超走向世界领先的保利尼奥
  3. 阿里云 云服务器 ECS——创建与绑定密钥对
  4. 实验 4 [bx]和 loop 的使用
  5. github可以传java吗_如何在github上传本地项目代码(新手使用)----亲测使用
  6. linux 网络编程:使用两线程实现socket同时收发数据
  7. leetcode 二叉树的层次遍历 II(Binary Tree Level Order Traversal II)
  8. jenkins重启 linux_在Linux中,Jenkins无法启动
  9. C#知识点:操作XML
  10. 第五章平稳过程(1)
  11. 关于stata软件的一些问题
  12. I2S时序及音频驱动
  13. 彻底搞懂数据库内连接、外连接
  14. flv转mp4选项设置
  15. python,在格式化字符串中使用半个大括号
  16. getAddrInfo与DNS域名解析与ping
  17. 神经网络的多任务学习概览
  18. 服务器电源线的分类及应用
  19. 1022 - 快手短视频广告主接入实践笔记
  20. word表格转换为图片

热门文章

  1. css在中元素添加元素,css - 在伪元素内容中添加换行符到:: after或:: before
  2. 使用阿里云接口进行银行卡三要素实名认证
  3. setTimeout()方法的使用
  4. 如何提升亚马逊产品的溢价能力?
  5. 多模态理论张德禄_观点 | 多模态视角下二语语用道歉行为研究
  6. zookeeper启动报mkdir: 无法创建目录: 没有那个文件或目录
  7. TP-link 无线路由器WDS设置方法图解_无线桥接设置 wifi无线变有线路由 中转站
  8. 公关传播策划有哪些核心步骤?
  9. 这21 张思维导图,足足让我肝了半个月的「后端技术学习路线」长啥样?(附全套Java资料)
  10. response对象常用方法