Android筆記 View 的事件體系(一)

Android 中的座標視圖體系
1、Android 座標系:

    系統提供了 getLocationOnScreen(int location[ ]) 這樣的方法來獲取 Android 座標系中點的座標,等效於在觸摸事件中使用 getRawX() 、getRawY()方法,獲取的是絕對座標,座標原點是屏幕的左上角


2、視圖座標系:

        在觸摸事件中,通過getX()、getY()來獲取座標位置,座標原點是以父視圖左上角爲座標原點。



3、觸摸事件(MotionEvent):
MotionEcent中封裝了以下觸摸事件的不同類型常量
    //單點觸摸按下動作
    public static final int ACTION_DOWN             = 0;

    //單點觸摸離開動作
    public static final int ACTION_UP               = 1;

    //觸摸點移動操作
    public static final int ACTION_MOVE             = 2;

    //觸摸動作取消
    public static final int ACTION_CANCEL           = 3;

    //觸摸動作超出邊界
    public static final int ACTION_OUTSIDE          = 4;

    //多點觸摸按下動作
    public static final int ACTION_POINTER_DOWN     = 5;

    //多點離開動作
    public static final int ACTION_POINTER_UP       = 6;

4、View提供的獲取座標方法(相對父容器的)
getTop():獲取到的是View自身的頂邊到其父佈局頂邊的距離
getLeft():獲取到的是View自身的左邊到其父佈局頂邊的距離
getRight():獲取到的是View自身的右邊到其父佈局頂邊的距離
getBottom():獲取到的是View自身的底邊到其父佈局頂邊的距離

5、MotionEvent 提供的方法:
getX():獲取點擊事件距離控件左邊的距離,即視圖座標(相對父容器的)
getY():獲取點擊事件距離控件頂邊的距離,即視圖座標(相對父容器的)
getRawX():獲取點擊事件距離整個屏幕左邊的距離,即絕對座標(相對屏幕的)
getRawY():獲取點擊事件距離整個屏幕頂邊的距離,即絕對座標(相對屏幕的)

從上我們能夠的出 View 的寬高和座標的關係:
width = right - left;
height = bottom - top;

這四個參數可從以下方式獲取:
left = getLeft();
right = getRitht;
top = getTop;
bottom = getBottom;

從Android3.0開始,另外還有幾個參數:x、y、translationX 和 translationY。
x、y是VIew左上角的座標,translationX 和 translationY 是View左上角相對於父容器的偏移量。默認爲0。
且 x = left + translationX,y = top + translationY

就是說在View平移的過程中,top、left、right、button這四個值是不會變化的,是原始位置,變化的是x、y、translationX 和 translationY這四個參數。


6、TouchSlop 系統能識別的最小滑動距離(一般爲8dp,因設備而不同),可過濾一些滑動操作

獲取方式:ViewConfiguration.get(getContext()).getScaledTouchSlop()

其中的get是爲了獲取一個ViewConfiguration類型的對象,然後這個對象再調用getScaledTouchSlop方法。

而它的默認值是定義在這裏的:

裏面的config.xml中:

<!-- Base "touch slop" value used by ViewConfiguration as a  
     movement threshold where scrolling should begin. -->  
<dimen name="config_viewConfigurationTouchSlop">8dp</dimen>  

Android 控件架構

概念:
        Android中所有控件在界面中佔得位置均是矩形,分爲ViewGroupView,通過ViewGoup使整個界面形成了一個樹形結構,由上層控件負責下層子控件的測量和繪製,並傳遞交互事件。每棵樹控件的頂部,都有一個ViewParent對象,是整顆樹的核心,所有交互管理事件都是由它來統一調度和分配,從而可以對整個視圖進行整體控制

Android 控件繼承結構圖:



Android 控件樹結構圖:


ViewGoup:可包含多個子控件,並管理其包含的子控件
ViewParent:控件樹的核心,調度和分配所有的交互管理事件

Android界面架構圖:


由上圖可看出,每個Activity中都包含一個Window對象,在Android中Wiondw對象通常由PhoneWindow來實現。

PhoneWindow將一個DecorView設置爲整個應用窗口的根View,是Window的具體繼承實現類。而且該類內部包含了一個
DecorView對象,該DectorView對象是所有應用窗口(Activity界面)的根View。顯示具體的界面內容

DecorView:窗口界面的頂層視圖,裏面封裝了一些窗口操作的通用方法,其把將要顯示的具體內容呈現在了PhoneWindow上,在此所有的View的事件監聽,都通過WindowManagerService(窗口管理服務,所有需要顯示到屏幕上的內容,都是通過WMS 來操控的,可見設計模式中的Builder 模式和點擊打開鏈接)來進行接收,並通過Activity對象來回調相應的onClickListener。

依據面向對象從抽象到具體我們可以類比上面關係就像如下:
Window是一塊電子屏,PhoneWindow是一塊手機電子屏,DecorView就是電子屏要顯示的內容,Activity就是手機電子屏安裝位置。

在顯示上,DecorView將屏幕分爲TitleViewContentView兩部分。
ContentView:一個ID爲content的FrameLayoutactivity_main.xml就是設置在這樣一個FramLayout中的。

DocrView標準視圖樹:



        視圖樹的第二層裝載了一個LinearLayout,作爲ViewGroup,這一層的佈局結構會根據對應的參數設置不同的佈局,如最常用的佈局--上面顯示TitleBar下面是Content這樣的佈局,也就是上圖的佈局。
        如果用戶通過設置requestWindowFeature(Window.FEATURE_NO_TITLE)來設置全屏顯示,視圖樹中就只有Content了,
所以requestWindowFeature() 方法一定要在調用setContentView()方法之前。

  • 在代碼中,當程序在onCreat()法中調用setContentView()方法後,ActivityManagerService會回調 onResume()方法,此時系統會把整個 DocrView添加到 PhoneWindow中,並讓其顯示出來。
全屏顯示:通過設置requestWindowFeature(Window.FEATURE_NO_TITLE)來設置全屏顯示,視圖樹中就只有Content了,所以requestWindowFeature()方法一定要在調用setContentView()方法之前。
發佈了38 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章