一、什么是View
Android中,控件大致可分為兩大類,即View與ViewGroup。View是Android中所有控件的基類,是控件的一種抽象。ViewGroup即控件組,可以把它看作一個容器,因為它可以包含多個View及ViewGroup。通過ViewGroup,整個界面上的控件形成了一個樹形結構,也就是我們常說的控件樹。
二、Android中的坐標系
根據參考對象的不同,Android中存在兩個坐標系。一個是Android坐標系,一個是視圖坐標系,兩者的區別在于坐標原點的選取。坐標系的單位長度是1px。
1. Android坐標系
Android坐標系的坐標原點是手機屏幕左上角,向右為X軸正方向,向下為Y軸正方向。方法getRawX()和getRawY()獲得的坐標就是此坐標系中的坐標。
2. 視圖坐標系
視圖坐標系的坐標原點是父控件的左上角,向右為X軸正方向,向下為Y軸正方向。其實大多數與位置有關的參數都是視圖坐標系中的坐標點。
三、位置參數與方法
位置參數與方法繁多,但這些都是必須掌握的,是觸摸事件、滑動控件的基礎。學習這些參數、方法最有效的方式就是自己打Log,根據Log信息去分析方法的含義。
- 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——速度追蹤器
速度追蹤器,用它可以監測手指水平豎直滑動速度。使用步驟:
- 關聯觸摸事件
VelocityTracker velocityTracker=VelocityTracker.obtain();
velocityTracker.addMovement(event); - 計算速度
velocityTracker.computeCurrentVelocity(1000);
//這里的參數是指“時間間隔”,速度=(終點-起點)/時間段,由此可知我們計算的速度是平均速度,速度可正可負,單位為像素/秒或者像素/毫秒。 - 獲取速度(獲取之前必須先計算)
int xVelocity=(int)velocityTracker.getXVelocity();
int yVelocity=(int)velocityTracker.getYVeloctiy(); - 重置并回收
velocityTracker.clear();
velocityTracker.recycle();
七、GestureDetector——手勢監測器
手勢監測,顧名思義,用于監測用戶單擊,滑動,長按,雙擊等行為。步驟如下:
- 創建GestureDetector對象,實現OnGestureListener接口
GestureDetector mGestureDetector=new GestureDetector(this); - 接管目標view的onTouchEvent方法
boolean consume=mGestureDetector.onTouchEvent(event);
return consume; - 有選擇的實現OnGestureListener和OnDoubleTapListener中的方法,這兩個接口中有各種各樣的諸如,單擊,雙擊,長按,嚴格單擊等等方法。這里不一一列出,可去查看相關文檔。
建議:如果只是監聽滑動相關的事件,使用onTouchEvent方法,如果監聽雙擊事件,使用GestureDetector實現。
結語
基礎知識先寫到這里,本人也是一個初學者,未免出現對知識點理解不全面的情況,有問題可留言,希望能與大家互相討論,共同學習。
轉載請注明出處http://www.lxweimin.com/p/b600895c585b 謝謝。