【Android - 自定義View】之View的位置參數

  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() 一段時間以後,再獲取這些參數。spa

 

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四個屬性的關係以下圖所示:code

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

 

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以後添加的新方法)。

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

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

 

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()方法獲取。

 

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座標的要求和上面的方法相同。

相關文章
相關標籤/搜索