最近項目中須要實現手勢上滑或者點擊滑出界面的效果,實現上是利用GestureDetector,而後在onFling中判斷,但遇到一個問題:手勢上滑是針對整個佈局的,但若是有對單獨的View設置點擊監聽,在該View上的手勢上滑會失效。ide
若是這個View自己就是專門用於點擊的,那並無什麼問題,惋惜的是,這個View的尺寸不大,因此要求擴大點擊區域。佈局
咱們首先能想到的方法就是用一個容器將該View包起來,相似RelativeLayout,LinearLayout等,但這樣佈局的層級就會再加多一層。編碼
咱們可否想到不用增長層級也能實現點擊區域擴大的方法呢?spa
GestureDetector是Android提供的手勢操做類,它提供了單擊,雙擊,長按等操做,而且會將這些事件傳給onTouch,所以咱們能夠利用這個來判斷觸發單擊事件的究竟是哪一個控件。code
可是咱們的問題是擴大點擊區域,而不是識別控件,所以須要知道用戶的點擊動做究竟是落在哪一個區域。blog
所幸,MotionEvent提供了事件發生時候的座標,這樣咱們就能知道單擊時候的座標,進一步肯定是否在指定的區域範圍內。索引
MotionEvent是Android中觸控方面編碼的一個相當重要的類,它提供了用戶在屏幕上的觸控信息。咱們能夠經過MotionEvent獲取到觸控的事件類型,觸控的座標,而且如今已經支持多點觸碰,還能進一步獲取觸控的索引信息。接口
咱們先上代碼:事件
1 @Override 2 public boolean onTouch(View v, MotionEvent event) { 3 if(event.getAction() == MotionEvent.ACTION_DOWN){ 4 int downX = (int)event.getX(); 5 int[] location = new int[2]; 6 ivMore.getLocationInWindow(location); 7 if(Math.abs(downX - location[0]) <= 50){ 8 ... 9 } 10 } 11 return gestureDetector.onTouchEvent(event); 12 }
咱們先經過MotionEvent的getAction,獲取到觸控的事件類型,單擊的類型爲ACTION_DOWN,而後經過MotionEvent的getX獲取到點擊的x座標,而後經過getLocationInWindow獲取指定的View的座標,這裏指定該組件的x軸座標正負50(表示左右範圍)內爲觸發範圍。get
咱們如今能夠不增長佈局層級也能擴大點擊範圍了。
利用GestureDetector實現上滑判斷是很簡單的,只要實現OnGestureListener接口,在對應的回調中進行咱們指定的操做,不過由於GestureDetector自己並不捕獲觸控事件,因此要再實現onTouch事件,並調用GestureDetector的onTouchEvent,將對應的事件傳過去。
滑動的操做是在onFling回調中進行的,該回調會傳進兩個歷史記錄的MotionEvent,咱們只要判斷它們的Y軸座標是否有變化便可。
Android的觸控是一個至關大的話題範圍,咱們只要在明確本身需求的前提上,去尋找對應的快捷解決方案。