安卓開發(fā)|圖案解鎖3

一、目的

1.實(shí)際使用賦tag值,以方便來查找想要的控件
2.繼續(xù)寫圖案解鎖。目標(biāo):實(shí)現(xiàn)點(diǎn)亮線

二、知識(shí)點(diǎn)

1.各個(gè)控件的tag值要怎么設(shè)置

1.九個(gè)點(diǎn)分別:1~9;
2.線就用兩個(gè)點(diǎn)的組合,如:1與4之間的線就用14
3.注意:添加的時(shí)候這條線跟下一條的關(guān)系,為避免錯(cuò)誤可以輸出結(jié)果測(cè)試,正確就去掉輸出語句,錯(cuò)了就改


2.怎么將點(diǎn)亮的點(diǎn)與下一個(gè)要點(diǎn)亮的點(diǎn)聯(lián)系起來,并點(diǎn)亮連接該兩點(diǎn)的線

可以得到點(diǎn)亮點(diǎn)的tag值然后(smaller*10+larger)就是線的tag值了
然后通過值找到(存在的)線,點(diǎn)亮就可以了
注:這其中需要變量來記錄當(dāng)前點(diǎn)和上一個(gè)點(diǎn),上一個(gè)點(diǎn)一開始是起始點(diǎn),一旦又點(diǎn)亮了一個(gè)點(diǎn),就把這個(gè)點(diǎn)設(shè)置為上一個(gè)點(diǎn)。

三、實(shí)際應(yīng)用:(今天的變動(dòng)地方有點(diǎn)多,但總體內(nèi)容不多,不用怕哦)

1.activity_main.xml

實(shí)現(xiàn)顯示文本

2.Main_Activity.java

不同之處:
與圖案解鎖2 的不同

onWindowFocusChanged里的if (hasFocus)

代碼:

  tag = 12;
                //創(chuàng)建橫線 6條
                for (int i = 0; i < 3; i++) {
                    for (int j = 0; j < 2; j++) {
                        //創(chuàng)建?一個(gè)視圖用于顯示線
                        ImageView lineView = new ImageView(this);
                        lineView.setBackgroundResource(R.drawable.normal_highlight1);
                        lineView.setVisibility(View.INVISIBLE);

                        //設(shè)置tag值
                        lineView.setTag(tag);System.out.println(tag);
                        //將tag值存入數(shù)組
                        lineViewTags.add(tag);
                        tag += 11;
                        //創(chuàng)建布局參數(shù)
                        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);
                    }
                    tag += 11;
                }

                tag = 14;
                //創(chuàng)建豎線 4條
                for (int i = 0; i < 2; i++) {
                    for (int j = 0; j < 3; j++) {
                        //創(chuàng)建一個(gè)視圖用于顯示線
                        ImageView lineView = new ImageView(this);
                        lineView.setBackgroundResource(R.drawable.normal_highlight2);
                        lineView.setVisibility(View.INVISIBLE);

                        //設(shè)置tag值
                        lineView.setTag(tag);System.out.println(tag);
                        //將tag值存入數(shù)組
                        lineViewTags.add(tag);
                        tag += 11;

                        //創(chuàng)建布局參數(shù)
                        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);
                    }
                }

                tag = 24;
                int rtag = 15;
                //創(chuàng)建斜線
                for (int i = 0; i < 2; i++) {
                    for (int j = 0; j < 2; j++) {
                        //創(chuàng)建?一個(gè)視圖用于顯示線
                        ImageView rLineView = new ImageView(this);
                        //設(shè)置圖片
                        rLineView .setBackgroundResource(R.drawable.normal_highlight3);
                        //設(shè)置tag值
                        rLineView.setTag(rtag);
                        //將tag值存入數(shù)組
                        lineViewTags.add(rtag);
                        rtag += 11;

                        //創(chuàng)建布局參數(shù)
                        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.setVisibility(View.INVISIBLE);
                        lLineView.setBackgroundResource(R.drawable.normal_highlight4);

                        lLineView.setTag(tag);
                        lineViewTags.add(tag);
                        tag += 11;

                        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);
                    }
                    rtag += 11;
                    tag += 11;
                }

                tag = 1;
                //創(chuàng)建9個(gè)點(diǎn)
                for (int i = 0; i < 3; i++) {
                    for (int j = 0; j < 3; j++) {
                        //創(chuàng)建?用于顯示點(diǎn)的視圖
                        ImageView dotView = new ImageView(this);;

                        dotView.setTag(tag);
                        tag += 1;

                        //隱藏視圖
                        dotView.setVisibility(View.INVISIBLE);
                        //顯示對(duì)應(yīng)的圖片
                        dotView.setBackgroundResource(R.drawable.selected_dot);
                         //創(chuàng)建控件的尺寸
                        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*i);                    params.topMargin = (int)(y + 162*scale) + (int)(98.66*scale*j);

                        params.leftMargin = (int)(x + 35.33*scale) + (int)(99*scale*j);
                        params.topMargin = (int)(y + 162*scale) + (int)(99*scale*i);

                        //將控件添加到容器中
                        rl.addView(dotView, params);
                        //將這個(gè)控件添加到數(shù)組
                         dotsList.add(dotView);
                    }
                }


onTouchEvent

代碼:

 case MotionEvent.ACTION_DOWN:
                //點(diǎn)擊
                //獲取觸摸點(diǎn)的坐標(biāo)
                x = event.getX();
                y = event.getY()
                ;
                //判斷x y是不不是在某個(gè)點(diǎn)的范圍內(nèi)
                selected = dotOfTouch(x, y);
                if (selected != null) {
                    //點(diǎn)亮
                    selected.setVisibility(View.VISIBLE);
                    //記錄當(dāng)前這個(gè)點(diǎn)
                    lastSelectedDot = selected;
                }
                break;
 case MotionEvent.ACTION_MOVE:
                //滑動(dòng)
                //獲取觸摸點(diǎn)的坐標(biāo)
                x = event.getX();
                y = event.getY();
                //判斷x y是不是在某個(gè)點(diǎn)的范圍內(nèi)
                selected = dotOfTouch(x, y);
                if (selected != null) {
                    //判斷這個(gè)點(diǎn)是不是起始點(diǎn)
                    if(lastSelectedDot == null){
                        //是起始點(diǎn)
                        selected.setVisibility(View.VISIBLE);
                        //記錄
                        lastSelectedDot = selected;
                    }else{
                        //不是起始點(diǎn)
                        //獲取上一個(gè)點(diǎn)和當(dāng)前點(diǎn)的tag

                        int lTag = (Integer)lastSelectedDot.getTag();//因?yàn)間etTag得出的是Object類型的,需要轉(zhuǎn)換
                        int cTag = (Integer)selected.getTag();

                        //組成線的tag
                        int lineTag = lTag > cTag ? cTag*10+lTag : lTag*10+cTag;

                        //判斷這條線是否存在
                        if(lineViewTags.contains(lineTag)){
                            //線存在  點(diǎn)亮點(diǎn)
                            selected.setVisibility(View.VISIBLE);

                            //點(diǎn)亮這條線
                            //獲取容器對(duì)象
                            RelativeLayout rl = findViewById(R.id.root_layout);

                            //通過tag值找容器里對(duì)應(yīng)的子控件
                            ImageView iv = rl.findViewWithTag(lineTag);
                            iv.setVisibility(View.VISIBLE);

                            //記錄這個(gè)點(diǎn)
                            lastSelectedDot = selected;
                        }
                    }
                        }
                break;
運(yùn)行效果
壓的有點(diǎn)丑,別介意

四、心得

又到了每日雞湯時(shí)間

最美的風(fēng)景不是明天的憧憬,而是今天努力開出的花朵。人的一生時(shí)光短暫,記得把握當(dāng)下。

確實(shí),如果你能把花在想象美好未來的時(shí)間用來做好當(dāng)下該做的事,說不定那些美好真的能到來。有句話說的非常好:“別一邊吃著炸雞一別想象自己瘦了的樣子。”


嘿嘿嘿,別打我
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,334評(píng)論 0 17
  • 圖片來源于網(wǎng)絡(luò),聯(lián)系,侵刪。 一、目的 1.學(xué)習(xí)如何控制控件的移動(dòng):動(dòng)作:點(diǎn)擊、滑動(dòng):控制點(diǎn):左上角、中心、右下角...
    zbywl白禮閱讀 625評(píng)論 0 2
  • Day1: 在代碼中通過R.string.hello_world可以獲得該字符串的引用; 在XML中通過@stri...
    冰凝雪國(guó)閱讀 1,639評(píng)論 0 5
  • (一)知識(shí)準(zhǔn)備 事件處理機(jī)制: 什么是事件處理機(jī)制?比如我們點(diǎn)擊QQ登錄界面上的登錄按鈕,我們就向服務(wù)器發(fā)送了一個(gè)...
    颵麏閱讀 641評(píng)論 0 5
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,663評(píng)論 1 32

友情鏈接更多精彩內(nèi)容