View的事件體系 - View基礎知識
阿新 • • 發佈:2018-11-22
View
View是Android所有控制元件的基類,任何一個控制元件都是View的子類。
座標系
關於Android的座標系可以從以下幾點加深理解:
- 手機螢幕座標系與數學座標系的區別
- View座標系
- MotionEvent的get與getRaw獲取座標的區別
手機螢幕與數學座標系的區別
手機螢幕座標是從左上角為原點,向右為X軸的遞增方向,向下為Y軸的遞增方向,這與我們數學上的座標系有著明顯的區別,如下:
其中的∠a 是對應的,注意Y軸方向!
View的座標系
- View的位置,只需知道
左上頂點
和右下頂點
的座標就可決定具體位置。- View的頂點座標是相對於父控制元件而言的。
左上頂點(x,y)
getLeft //子View左上角相對於父View的左側距離
geTop //子View左上角相對於父View的頂部距離
右下頂點(x,y)
getRight //子View右下角相對於父View的左側距離
getBottom //子View右下角相對於父View的頂部距離
可以根據左上頂點和右下頂點的座標確定一個View的寬高,如下:
width = getRight - getLeft //寬
height = getBottom - getTop //高
MotionEvent的get與getRaw的區別
手指在接觸屏幕後產生一系列事件,如下:
- ACTION_DOWN:手指剛接觸螢幕
- ACTION_MOVE:手指在螢幕上移動
- ACTION_UP:手指離開螢幕的瞬間
正常情況下,觸控式螢幕幕有以下一系列行為事件:
- 單擊後立即鬆開:0 >> 1,即DOWN >> UP
- 單擊後在螢幕上滑動一會兒再鬆開:0 >> 2 ···2 >> 1,即DOWN >> MOVE ··· MOVE >>UP
除了事件響應外,系統還提供了獲取單擊點選事件的座標方法,分別是getX/getY
、getRawX/getRawY
;這兩組方法是區別的,如下:
getX/getY
:是相對於當前View左上角的座標
getRawX/getRawY
:是相對於手機螢幕左上角的座標
另外獲取檢視上某個點的螢幕座標除了getRaw方法外,還可以通過View自身的getLocationOnScreen(int[] outLocation)
方法來獲取。
int[] views = new int[2];
mTvTest.getLocationOnScreen(views);
Log.d(TAG,name+ " -- x: " + views[0] + " y:" + views[1]);
在使用getLocationOnScreen
方法時,只能獲取到View的左上頂點
的座標,同時還需注意的是,如果直接在onCreate、onStart、onResume方法中呼叫是無法得到座標的實際值,只有當螢幕焦點發生了改變時才可以獲取實際座標值
,比如在onWindowFocusChanged
或者在點選事件、滑動事件監聽函式
中呼叫等等。
不單單getLocationOnScreen方法,其他獲取座標的方法及寬高,同樣也需放在焦點發生變化時,才可以正確的獲取到具體值,也就是說要待View測量完成後,才能獲取到具體值。