Android開發—View的位置參數

1.引言


View是Android中所有控件的基類,不管是簡單的Button和TextView,還是複雜的RelativeLayout和ListView,其基類都是View類;ViewGroup也繼承了View類,這意味着View本身就可以代表簡單的和複雜的所有控件和佈局,通過這種關係,就形成了View樹的結構。

  在操作View的時候,尤其是在處理自定義View的一些事件的時候,我們往往需要獲取到目標View的這樣或那樣的參數。下面就來簡單介紹一下View的各種參數及其用法。

  View有這樣的一些屬性:x、y、z、left、right、top、bottom、elevation、translationX、translationY、translationZ、rawX、rawY等等,下面一一介紹這些參數的意義及如何獲取這些參數。

  這裏需要注意一點:以下方法,如果直接在Activity的onCreate()方法中調用,則可能會返回0,這是因爲在程序剛剛啓動,剛剛開始繪製這個View的時候,我們就要獲取這個View的各個位置參數,當然會返回0。解決方法是:在Activity的 onWindowFocusChanged() 方法中獲取;或者可以新建一個線程,先 Thread.sleep() 一段時間之後,再獲取這些參數。


2.參數:  

left、right、top、bottom、elevation

  這五個參數代表的是View的原始位置相對於其父控件邊緣的距離:

  • left:目標View的最左邊和這個View所在父控件的最左邊的距離,通過view.getLeft()方法獲取;
  • right:目標View的最右邊和這個View所在父控件的最左邊的距離,通過view.getRight()方法獲取;
  • top:目標View的最上邊和這個View所在父控件的最上邊的距離,通過view.getTop()方法獲取;
  • bottom:目標View的最下邊和這個View所在父控件的最上邊的距離,通過view.getBottom()方法獲取;
  • elevation:目標View的Z軸高度和這個View所在的父控件所在的Z軸高度的距離,通過view.getElevation()方法獲取(這個屬性是Android 5.0之後添加的新屬性)。

  left、right、top和bottom四個屬性的關係如下圖所示:

  注意:View的這五個屬性值代表的是View的原始位置座標值,無論這個View被移動到了什麼位置,或者被縮放、旋轉了多少,這五個值都是永久不變的。

 

translationX、translationY、translationZ

  這三個參數代表的是在動畫或者滑動View的時候,View的當前位置相對於其原始位置平移的距離:

  • translationX:在滑動過程中,View當前位置的最左邊和這個View原始位置的最左邊的距離,通過view.getTranslationX()方法獲取;
  • translationY:在滑動過程中,View當前位置的最上邊和這個View原始位置的最上邊的距離,通過view.getTranslationY()方法獲取;
  • translationZ:在動畫過程中,View當前位置的Z軸高度和這個View原始Z軸高度的距離,通過view.getTranslationZ()方法獲取(這個方法是Android 5.0之後添加的新方法)。

 

x、y、z

  這三個參數代表的是View的當前位置相對於其父控件的距離:

  • x:目標View的當前位置的最左邊和這個View所在父佈局的最左邊的距離,通過view.getX()方法獲取;
  • y:目標View的當前位置的最上邊和這個View所在父佈局的最上邊的距離,通過view.getY()方法獲取;
  • z:目標View的當前位置的Z軸位置和這個View所在父佈局的Z軸位置的距離,通過view.getZ()方法獲取(這個方法是Android 5.0之後添加的新方法)。

  這三個參數和前面的幾個參數的關係公式如下:

  • x = left + translationX;
  • y = top + translationY;
  • z = elevation + translationZ;

 

3.MotionEvent相關

  MotionEvent是我們用來操作View的觸摸事件的類,當我們對屏幕進行一次操作的時候,就會觸發MotionEvent中的幾個觸摸事件:

  • ACTION_DOWN:手指剛剛觸摸到屏幕時觸發的事件;
  • ACTION_MOVE:手指在屏幕上移動的時候觸發的事件;
  • ACTION_UP:手指從屏幕上擡起的一瞬間觸發的事件。

  因此,對於我們常常做的一些操作,相應的事件觸發順序如下:

  • 點擊屏幕後立刻擡起手指:DOWN -> UP
  • 滑動屏幕:DOWN -> MOVE -> ... -> MOVE -> UP

  使用MotionEvent類,我們還可以獲取到觸摸屏幕時View的一些位置參數:

  • x:當前觸摸的位置相對於目標View的X軸座標,通過getX()方法獲取;
  • y:當前觸摸的位置相對於目標View的Y軸座標,通過getY()方法獲取;
  • rawX:當前觸摸的位置相對於屏幕最左邊的X軸座標,通過getRawX()方法獲取;
  • rawY:當前觸摸的位置相對於屏幕最上邊的Y軸座標,通過getRawY()方法獲取。

 

4.View相對屏幕的距離

  這裏說的View相對屏幕的距離,是指View的左上角相對於手機屏幕左上角的座標。可以使用以下幾個方法獲取:

getLocationInWindow()

  這個方法的用法代碼如下:

int[] position = new int[2];
view.getLocationInWindow(position);
System.out.println("(" + position[0] + "," + position[1] + ")");

  如果當前Activity是普通的Activity,則用這個方法得到的position數組中的第二個參數(Y座標值)表示可見的狀態欄的高度 + 可見的標題欄的高度 + View上端到標題欄下端的距離

  如果當前Activity是對話框式的Activity,則Y座標值表示可見的標題欄的高度 + View上端到標題欄下端的距離

  注意:這裏的“可見”表示的是能看到的,如果一個Activity中的狀態欄或標題欄被隱藏了,則其高度用0表示。

getLocationOnScreen()

  這個方法的用法代碼如下:

int[] position = new int[2];
view.getLocationOnScreen(position);
System.out.println("(" + position[0] + "," + position[1] + ")");

  這個方法對Y座標的要求和上面的方法相同。

getGlobalVisibleRect()

  這個方法的用法代碼如下:

Rect rect = new Rect();
view.getGlobalVisibleRect(rect);
System.out.println("(" + rect.left + "," + rect.top + ")");

  Rect在這裏的作用是“套住”這個View,其對Y座標的要求和上面的方法相同。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章