1. 程式人生 > >View的事件體系 - View基礎知識

View的事件體系 - View基礎知識

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/getYgetRawX/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測量完成後,才能獲取到具體值。

參考