圖片來源于網絡,聯系磨镶,侵刪溃蔫。
一、目的
1.學習如何控制控件的移動:動作:點擊琳猫、滑動:控制點:左上角伟叛、中心、右下角
2.繼續(xù)寫圖案解鎖脐嫂。目標:實現移動和點擊點亮圖標
二统刮、知識點
1.在屏幕上點擊,控件的移動到點擊位置
@Override
public boolean onTouchEvent(MotionEvent event) {
//獲取事件對應類型
int action = event.getAction();
//解決觸摸點和移動點不對應
//獲取屏幕的大小
Point p = new Point();
getWindowManager().getDefaultDisplay().getSize(p);//則屏幕高度:p.y
//獲取容器寬高
RelativeLayout rl = findViewById(R.id.root);//則屏幕高度:rl.getHeight
//屏幕和容器差值(狀態(tài)欄和標題欄的高度)
float padding = p.y-rl.getHeight();
按下
if(action == MotionEvent.ACTION_DOWN){
//獲取觸摸點坐標
float x = event.getX();
float y = event.getY()-padding;
//改變控件的位置
redview.setX(x-(float)redview.getWidth()/2);
redview.setY(y-(float)redview.getHeight()/2);
}
滑動
float x = event.getX();
float y = event.getY()-padding;
//改變控件的位置
redview.setX(x-(float)redview.getWidth());
redview.setY(y-(float)redview.getHeight());
}else if(action == MotionEvent.ACTION_UP){
//離開屏幕
}else{
//被打斷了
}
return true;
}
對應的xml文件
控制中心點
//改變控件的位置
redview.setX(x-(float)redview.getWidth()/2);
redview.setY(y-(float)redview.getHeight()/2);
控制左上角
//改變控件的位置
redview.setX(x);
redview.setY(y);
控制右下角
//改變控件的位置
redview.setX(x-(float)redview.getWidth());
redview.setY(y-(float)redview.getHeight());
2.解決點擊點坐標于控件移動坐標不一致的問題
- 讓觸摸點切換到控件的父視圖中
Point p = new Point();
getWindowManager().getDefaultDisplay().getSize(p);
//獲取容器?本身的寬高
RelativeLayout rl = findViewById(R.id.root_layout);
//計算狀態(tài)欄或者標題欄的距離
float padding = p.y - rl.getHeight();
2.讓控件切換到屏幕坐標系
ImageView firt = dotsList.get(0);
int[] loc = new int[2];
firt.getLocationOnScreen(loc);
System.out.println("相對屏幕y:"+loc[1]);
System.out.println("相對容器y:"+firt.getY());
System.out.println("原本寬度:"+firt.getWidth());
3.事件處理之 回調
(1.監(jiān)聽處理事件
1.事件源:圖片账千、按鈕侥蒙、滾動視圖
2.監(jiān)聽者:監(jiān)聽事件是否發(fā)送
3.事件:點擊、長按蕊爵、旋轉
2.回調處理事件)
重寫觸摸回調的事件(onTouchEvent)
- 返回值 true-已處理不會繼續(xù)傳遞 false-自己不消費辉哥,事件繼續(xù)傳
- 系統(tǒng)自動將事件包裝為MotionEvent類
- 用戶可以獲取事件的行為 ——getAction
- ACTION_DOWN桦山、ACTION_MOVE攒射、ACTION_UP、ACTION_CANCEL
- 獲取觸摸點坐標——getX getY
4.使用tag查找子控件
查找一個控件可以是加id可以是使用tag值
但是對于一些不在xml文件里添加的就不能用id了
注意:用tag值查找某個控件之前要先獲取該控件的父容器恒水,然后再在父容器下用**findViewWithTag()会放; **方法去查找。
就像你去到一個學校你要找一個人钉凌,你得先找到他所在的班級
@Override
public boolean onTouchEvent(MotionEvent event) {
//更改控件的顏色
//redview.setBackgroundColor(Color.BLACK);
//找到父容器
RelativeLayout rl = findViewById(R.id.root);
//通過tag值找到父容器下的子控件
View iv = rl.findViewWithTag("1");
iv.setBackgroundColor(Color.BLUE);
return true;
}
對應的xml文件
三咧最、實際應用:圖片解鎖2 | 點亮圖標
與昨天內容的區(qū)別:
1.監(jiān)聽觸摸事件
@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);
}
break;
case MotionEvent.ACTION_MOVE:
//滑動
//獲取觸摸點的坐標
x = event.getX();
y = event.getY();
//判斷x y是不是在某個點的范圍內
selected = dotOfTouch(x, y);
if (selected != null) {
selected.setVisibility(View.VISIBLE);
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
2.寫?個方法 處理 判斷觸摸點是否在控件內部
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;
}
實現效果:
四、心得
點的點亮很容易御雕,接下來就要思考線的點亮怎么實現了矢沿,因為線多且范圍有重復,所以不能用點亮點的方式酸纲,今天學了用tag值來找控件捣鲸,我們可以給每個控件賦tag值,通過tag值判斷是否該點亮線闽坡,那么要怎樣賦值才你很好的表示線呢栽惶?先思考一下吧,明天繼續(xù)實現點亮線疾嗅。