一、目的
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)下該做的事,說不定那些美好真的能到來。有句話說的非常好:“別一邊吃著炸雞一別想象自己瘦了的樣子。”

嘿嘿嘿,別打我