Android中滑動效果的產生,無非是一個滑動一個view,本質上就是移動一個view。移動一個view,就要改變當前所處的位置,就需要不斷的改變view的坐標來實現。所以,要實現view的滑動,就必須監聽用戶的觸摸事件,并根據事件傳入的坐標,動態且不斷改變view大的坐標,從而實現view跟隨用戶觸摸的滑動而滑動。所以,要想實現滑動效果,我們必須要了解一下Android中窗口坐標系和屏幕的觸控事件——MotionEvent。
當用戶觸摸屏幕時,將創建一個MotionEvent對象。MotionEvent包含關于發生觸摸的位置和時間等細節信息。MotionEvent對象是與用于觸摸相關的時間序列,該序列從用戶首次觸摸屏幕開始,經歷手指在屏幕表面的任何移動,直到手指離開屏幕時結束。移動過程中會產生大量事件,每個事件都會產生對應的MotionEvent對象,來記錄發生的操作、觸摸的位置、使用多大的壓力、觸摸的面積、發生的時間等相關信息。綜上所有的一切一切,都和Android中的坐標系脫離不了關系,所以我們先來研究下Android中的坐標系。
在Android中,將屏幕的左上角的頂點作為Android坐標系的原點,從這個點向右是X軸的正方向,從這個點向下是Y軸正方向,如下圖:
如上圖所示,Android坐標系以手機屏幕左上角的頂點為坐標原點,從該點向右為x軸正方向,從該點向下為y軸正方向。而觸控事件中,使用getRawX()和getRawY()方法,獲取的坐標就是以這個坐標系為標準下的坐標值。
android中的另外一個坐標系叫做視圖坐標系,它描述的是子視圖在父視圖中的位置。再貼一張圖來說明,如下:
如上圖所示,視圖坐標系是以父視圖的左上角為坐標原點的。相應的原點向右為x軸正方向,原點向下為y軸正方向。在觸控中,通過getX()和getY()來獲取的坐標值就是視圖坐標系中的坐標值。
在android中,提供了非常豐富的方法來獲得坐標值和相對距離。但是在使用這些方法的時候,一定要清楚是以哪個坐標系為標準來獲取的。為了將這些方法一一說明清楚,我也準備了一張圖,如下:
上面的那張圖很好的說明了每個方法獲得的坐標值或者距離都是從哪里到哪里的。說明一下,圖中有三個黑色的框框,外層的是手機屏幕,中間層的是ViewGroup,內層的是ViewGroup中放置的view。
其實上圖中標注的方法可以分為兩類,一類是View提供的方法,一類是MotionEvent提供的方法。分別說明如下:
View提供的獲取的坐標以及距離的方法:
getTop() 獲取到的是view自身的頂邊到其父布局頂邊的距離
getLeft() 獲取到的是view自身的左邊到其父布局左邊的距離
getRight() 獲取到的是view自身的右邊到其父布局左邊的距離
getBottom() 獲取到的是view自身底邊到其父布局頂邊的距離
MotionEvent提供的方法:
getX() 獲取點擊事件距離控件左邊的距離,即視圖坐標
getY() 獲取點擊事件距離控件頂邊的距離,即視圖坐標
getRawX() 獲取到的是點擊事件距離整個屏幕左邊的距離,即絕對坐標
getRawY() 獲取到的是點擊事件距離整個屏幕頂邊的距離,即絕對坐標