Android开发中图案解锁完整版

学习目的

通过学习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在代码中起什么作用,清楚了如何让控件切换到屏幕的坐标系。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容