学习目的

通过学习Android里面的onTouchEvent方法对上篇的图案解锁进行完善,调用touch方法实现触控功能和tag值得用法。

先关技术、及其使用

1、重写onTouchEvent方法

返回值表示表示这个事件是否已经被处理,true表示已经被处理了/消费了,false表示还没有被处理/消费。

在方法里面系统自动将事件包装MotionEvent类,事件有ACTION_DOWN ACTION_MOVE ACTION_UP ACTION_CANSLE,然后通过getAction获取事件

2、在xml里面创建控件并添加id ,在通过Java代码中findViewById 找到对应的控件,用getACtoin获取事件类型

//获取事件类型

int action = event.getAction();

在判断是什么事件,然后实现每个事件的相应功能,touch事件需要获取到触摸点在屏幕上的坐标。

(1)ACTION_DOWN 触摸

case MotionEvent.ACTION_DOWN:

//按下

//获取触摸点的坐标

x = event.getX();

y = event.getY();

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

selected = dtoOfTouch(x,y);

if(selected != null) {

//点亮

selected.setVisibility(View.VISIBLE);

//记录当前这个的点

lastSelectDot = selected;

//将tag值拼接到密码中

password.append(selected.getTag());

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

selectedList.add(selected);

}

break;

(2)ACTION_MOVE 移动,实现移动功能需要获取到移动过程中划过的点和和线,然后对齐点亮,所以要给对应的点和线添加tag值

case MotionEvent.ACTION_MOVE:

//移动

x = event.getX();

y = event.getY();

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

selected = dtoOfTouch(x,y);

if(selected != null) {

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

if(lastSelectDot == null){

//第一个点

selected.setVisibility(View.VISIBLE);

//记录

lastSelectDot = selected;

//将tag值拼接到密码中

password.append(selected.getTag());

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

selectedList.add(selected);

}else{

//不是第一个点

//获取上一个点和当前点的tag组成的线的tag值

int LTag = (Integer) lastSelectDot.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);

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

selectedList.add(selected);

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

selectedList.add(iv);

}

}

}

break;

(3)ACTION_UP离开,离开里面需要将move里面获取绘制的图案保存,保存也是通过记录划过点的tag值进行拼接保存。

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("passwrod",MODE_PRIVATE);

SharedPreferences.Editor editor = sp.edit();

editor.putString("pwd",firstPassword);

editor.commit();

}else {

//设置失败

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

firstPassword = null;

}

}

}

clean();

另外,还需要写clean方法对所选的图案进行清空,以及dtoOfTouch方法来判断触摸点是否在控件内部

clean方法

//清空

public void clean(){

password.setLength(0);

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

for(ImageView iv : selectedList){

iv.setVisibility(View.INVISIBLE);

}

//清空数组

selectedList.clear();

}

dtoOfTouch 方法

//写一个方法用于处理判断触摸点是否在某个控件内部

public ImageView dtoOfTouch(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;

}

PS

学习了tag值得相关使用,但是还是不太懂tag值得用法,只清楚tag在代码中起什么作用,清楚了如何让控件切换到屏幕的坐标系。

android开发图案解锁,Android开发中图案解锁完整版相关推荐

  1. 贡献30本经典Linux学习和开发教程和资料,都是pdf完整版的

    贡献30本经典Linux学习和开发教程和资料,都是pdf完整版的 |字号 订阅 完全免费下载:无需注册也无需积分 pdf版经典Linux学习教程资料列表:     电子书       下载链接    ...

  2. 计算机在材料表征方面的应用,计算机在材料科学中的应用---完整版

    计算机在材料科学中的应用---完整版 计算机在材料科学中的应用 1 材料:是人类生产和生活水平提高的物质基础,是人类文明的重要支柱和进步的里程碑. 20世纪下半叶形成的以新材料技术为基础:信息技术.新 ...

  3. 材料科学计算机科学,计算机在材料科学中的应用---完整版.doc

    计算机在材料科学中的应用---完整版.doc PAGE PAGE 17 计算机在材料科学中的应用1 材料:是人类生产和生活水平提高的物质基础,是人类文明的重要支柱和进步的里程碑.20世纪下半叶形成的以 ...

  4. python微服务开发pdf_《微服务设计》中文完整版PDF电子书下载

    版权声明 1. 本站文章和资源均来自互联网收集和整理,本站不承担任何责任及版权问题. 2. 相关版权归作者及其公司所有,仅供学习研究用途,请勿用于商业目的. 3. 请于下载后24小时内删除,如果喜欢此 ...

  5. c语言编程图案大全,C语言中图案的编程

    用星号打印各种图形及参考答案 [4.4]输入n值,输出如图所示矩形. [4.5]输入n值,输出如图所示平行四边形. #include void main( ) { int i,j,n; printf( ...

  6. Android版哆啦A梦连连看游戏源码完整版

    本代码主本人编写,没版权问题,另有其他少量小游戏和应用源码稍后会陆续上线!哆啦A梦连连看包括了2种游戏模式和60关卡,并可以通过修改配置文件很方便的实现自行增加新关卡.采用andengine游戏引擎开 ...

  7. 微信公众号开发:获取openId和用户信息(完整版)

    注:之前总结怎么进行本地公众号开发调试,时间一长忘记开发配置却忘了,所以这里记录一下公众号开发配置,方便快速上手. 目录 开发前服务器配置 网页授权获取用户基本信息 snsapi_base snsap ...

  8. vue3中使用swiper完整版教程

    介绍 在 vue3 中使用 swiper, 实现轮播图的效果:如果组件样式等模块引入不当,很有可能导致,页面无效果:或者想要的箭头或者切换效果异常问题.具体使用方式如下所示: 使用方式 使用命令 np ...

  9. 计算机软件在矿井地质中的应用,(完整版)遥感导论知识点整理(梅安新版)

    遥感导论知识点整理 [题型] 一.选择题 二.填空题 三.名词解释 四.简答题 五.论述题 注意:标注页码的地方比较难理解,希望大家多看看书,看看ppt.[第一章]绪论 1.[名]遥感(remote ...

  10. 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全

    史上最牛的Linux内核学习方法论   点击下载 我的arm_linux移植笔记   点击下载 S3C2440完全开发流程   点击下载 Linux系统命令及其使用详解完整版   点击下载 Linux ...

最新文章

  1. Crunch Bang(linux)安装Webstorm上手
  2. 通过Clocking Wizard定制和生成一个IP核(MMCM)(Virtex7)(ISE版)
  3. visual c++ 6.0原版_C/C++编程笔记:C语言函数指针的理解与使用,就是这么简单明了!...
  4. 【Python-ML】神经网络-多层感知器
  5. 年结 利润分配-未分配利润年结
  6. [转]序列化悍将Protobuf-Net,入门动手实录
  7. jquery jstree 插件的使用
  8. go nil json.marshal 完是null_字节跳动踩坑记#3:Go服务灵异panic
  9. Python 字典或JSON模拟数据库的增删改查
  10. C语言小游戏,笑傲江湖之鸿蒙
  11. 【Keil变量定义】定义extern类型变量
  12. 【思想总结】关于最近思想滑坡的反省
  13. vue实现抽奖大转盘
  14. 键盘输入圆的半径求圆的周长和面积
  15. 子网与超网的含义和区别
  16. Android面试题总结(三)
  17. seneca mysql_seneca-entity的mysql插件自增主键
  18. python编写代码实现文件的拷贝功能_python从一个文件夹自动拷贝文件到目标文件夹的代码...
  19. 计算机考试准考证尺寸标准
  20. android app 素材下载地址,素材空间app下载-素材空间 安卓版v3.4.7-PC6安卓网

热门文章

  1. EMX,PROC文件与电感的简单仿真
  2. 八道二叉树基础程序面试题
  3. 【Simulink教程案例12】基于BPSK+costas环载波同步的simulink建模与仿真分析
  4. Win7如何禁用安全模式 如何禁止进入安全模式?
  5. 微信公众号之刷卡支付
  6. 关于DFS(深度优先搜索)与DP(动态规划)的思考
  7. 安卓Android活动社交仿QQ聊天app设计
  8. 手机的IMEI、MEID、ICCID、UDID、IMSI
  9. 自学Java如何快速的找到工作?
  10. zk-web框架的学习之路,重新认识Java,Eclipse安装zk插件