View的基礎知識

一、什么是View

Android中,控件大致可分為兩大類,即View與ViewGroup。View是Android中所有控件的基類,是控件的一種抽象。ViewGroup即控件組,可以把它看作一個容器,因為它可以包含多個View及ViewGroup。通過ViewGroup,整個界面上的控件形成了一個樹形結構,也就是我們常說的控件樹。

二、Android中的坐標系

根據參考對象的不同,Android中存在兩個坐標系。一個是Android坐標系,一個是視圖坐標系,兩者的區別在于坐標原點的選取。坐標系的單位長度是1px。

android中的坐標系.png
1. Android坐標系

Android坐標系的坐標原點是手機屏幕左上角,向右為X軸正方向,向下為Y軸正方向。方法getRawX()和getRawY()獲得的坐標就是此坐標系中的坐標。

2. 視圖坐標系

視圖坐標系的坐標原點是父控件的左上角,向右為X軸正方向,向下為Y軸正方向。其實大多數與位置有關的參數都是視圖坐標系中的坐標點。

三、位置參數與方法

位置參數與方法繁多,但這些都是必須掌握的,是觸摸事件、滑動控件的基礎。學習這些參數、方法最有效的方式就是自己打Log,根據Log信息去分析方法的含義。


位置參數方法.png
  • View提供的獲取坐標的方法:
    getTop():view自身頂邊到父控件頂邊之間的距離。
    getLeft():view自身左邊到父控件左邊之間的距離。
    getRight():view自身右邊到父控件左邊之間的距離。
    getBottom():view自身下邊到父控件頂邊之間的距離。

note:這幾個方法獲取的是視圖坐標值。它們只與view初始擺放位置有關,也就是說在移動控件的過程中,這些方法的返回值是不會隨控件的位置改變的,除非認為修改了它們的值,如修改了margin值。

  • MotionEvent(觸摸事件)提供的方法:
    getX():點擊事件(觸控點)距離當前控件左邊之間的距離。
    getY():點擊事件(觸控點)距離當前控件頂邊之間的距離。
    getRawX():點擊事件(觸控點)距整個屏幕左邊之間的距離。
    getRawY():點擊事件(觸控點)距整個屏幕上邊之間的距離。

note:前兩個方法獲取的坐標值是視圖坐標值。你可以將觸控點理解為當前view中的內容,那么它的父控件就是當前view。
后兩個方法獲取的坐標值是絕對坐標值。這四個方法通常用來計算偏移量。

四、MotionEvent——觸控事件

MotionEvent即觸控事件,典型觸控事件有如下幾種:

  • ACTION_DOWN=0——單點觸摸按下;
  • ACTION_MOVE=2——觸摸點移動;
  • ACTION_UP=1——單點觸摸抬起;
  • ACTION_CANCEL=3——觸摸動作取消;
    正常情況下,一次手指觸摸屏幕的行為至少會有兩個事件發生,即按下抬起(按下取消)。這其中還可能會有一系列的ACTION_MOVE事件。

通常情況下,我們會在onTouchEvent(MotionEvent event)方法中通過event.getAction()方法獲取觸控事件的類型,并使用switch語句篩選,模板代碼如下:

  public boolean onTouchEvent(MotionEvent event){
  //獲取當前輸入點的坐標
      int x=(int)event.getX();
      int y=(int)event.getY();
      switch(event.getAction()){
          case MotionEvent.ACTION_DOWN:
          .....//處理按下事件
          break;
          case MotionEvent.ACTION_MOVE:
          .......//處理移動事件
          break;
          case MotionEvent.ACTION_UP:
          .......//處理抬起事件
          break;
        }
        return true;
      }

五、TouchSlop——最小滑動距離

TouchSlop即最小滑動距離,當你兩次滑動之間的距離差小于這個常量(這個常量和設備有關)時,系統不認為你進行了滑動操作,這樣我們可以使應用具有更好的用戶體驗。
可以通過如下方法獲得這個值:

ViewConfigration.get(getContext()).getScaledTouchSlop();

同樣,你也可以在源碼中找到這個常量的定義:

Path:frameworks/base/core/res/res/values/config.xml
<dimen name="config_viewConfigrationTouchSlop">

六、VelocityTracker——速度追蹤器

速度追蹤器,用它可以監測手指水平豎直滑動速度。使用步驟:

  1. 關聯觸摸事件
    VelocityTracker velocityTracker=VelocityTracker.obtain();
    velocityTracker.addMovement(event);
  2. 計算速度
    velocityTracker.computeCurrentVelocity(1000);
    //這里的參數是指“時間間隔”,速度=(終點-起點)/時間段,由此可知我們計算的速度是平均速度,速度可正可負,單位為像素/秒或者像素/毫秒。
  3. 獲取速度(獲取之前必須先計算)
    int xVelocity=(int)velocityTracker.getXVelocity();
    int yVelocity=(int)velocityTracker.getYVeloctiy();
  4. 重置并回收
    velocityTracker.clear();
    velocityTracker.recycle();

七、GestureDetector——手勢監測器

手勢監測,顧名思義,用于監測用戶單擊,滑動,長按,雙擊等行為。步驟如下:

  1. 創建GestureDetector對象,實現OnGestureListener接口
    GestureDetector mGestureDetector=new GestureDetector(this);
  2. 接管目標view的onTouchEvent方法
    boolean consume=mGestureDetector.onTouchEvent(event);
    return consume;
  3. 有選擇的實現OnGestureListener和OnDoubleTapListener中的方法,這兩個接口中有各種各樣的諸如,單擊,雙擊,長按,嚴格單擊等等方法。這里不一一列出,可去查看相關文檔。

建議:如果只是監聽滑動相關的事件,使用onTouchEvent方法,如果監聽雙擊事件,使用GestureDetector實現。

結語

基礎知識先寫到這里,本人也是一個初學者,未免出現對知識點理解不全面的情況,有問題可留言,希望能與大家互相討論,共同學習。
轉載請注明出處http://www.lxweimin.com/p/b600895c585b 謝謝。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容