1. 程式人生 > >GestureDetector進行左右滑動

GestureDetector進行左右滑動

GestureDetector介紹

  Detector的意思就是探測者,所以GestureDetector就是用來監聽手勢的發生。它內部有3個Listener介面,用來回調不同型別的觸控事件,用一個簡略的類圖來顯示:


  
  裡面這些介面的方法,就是相應觸控事件的回撥,實現了這些方法,就能實現傳入觸控事件之後做出相應的回撥。

一些回撥介面:

1.OnGestureListener,這個Listener監聽一些手勢,如單擊、滑動、長按等操作:
- onDown(MotionEvent e):使用者按下螢幕的時候的回撥。
- onShowPress(MotionEvent e):使用者按下按鍵後100ms(根據Android7.0原始碼)還沒有鬆開或者移動就會回撥,官方在原始碼的解釋是說一般用於告訴使用者已經識別按下事件的回撥(我暫時想不出有什麼用途,因為這個回撥觸發之後還會觸發其他的,不像長按)。
- onLongPress(MotionEvent e):

使用者長按後(好像不同手機的時間不同,原始碼裡預設是100ms+500ms)觸發,觸發之後不會觸發其他回撥,直至鬆開(UP事件)。
- onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):手指滑動的時候執行的回撥(接收到MOVE事件,且位移大於一定距離),e1,e2分別是之前DOWN事件和當前的MOVE事件,distanceX和distanceY就是當前MOVE事件和上一個MOVE事件的位移量。
- onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY):
使用者執行拋操作之後的回撥,MOVE事件之後手鬆開(UP事件)那一瞬間的x或者y方向速度,如果達到一定數值(原始碼預設是每秒50px),就是拋操作(也就是快速滑動的時候鬆手會有這個回撥,因此基本上有onFling必然有onScroll)。
- onSingleTapUp(MotionEvent e):使用者手指鬆開(UP事件)的時候如果沒有執行onScroll()onLongPress()這兩個回撥的話,就會回撥這個,說明這是一個點選擡起事件,但是不能區分是否雙擊事件的擡起。

2.OnDoubleTapListener,這個Listener監聽雙擊和單擊事件。
- onSingleTapConfirmed(MotionEvent e):

可以確認(通過單擊DOWN後300ms沒有下一個DOWN事件確認)這不是一個雙擊事件,而是一個單擊事件的時候會回撥。
- onDoubleTap(MotionEvent e):可以確認這是一個雙擊事件的時候回撥。
- onDoubleTapEvent(MotionEvent e):onDoubleTap()回撥之後的輸入事件(DOWN、MOVE、UP)都會回撥這個方法(這個方法可以實現一些雙擊後的控制,如讓View雙擊後變得可拖動等)。

3.OnContextClickListener,很多人都不知道ContextClick是什麼,我以前也不知道,直到我把平板接上了外接鍵盤——原來這就是滑鼠右鍵。。。
- onContextClick(MotionEvent e):當滑鼠/觸控板,右鍵點選時候的回撥。

4.SimpleOnGestureListener,實現了上面三個介面的類,擁有上面三個的所有回撥方法。

- 由於SimpleOnGestureListener不是抽象類,所以繼承它的時候只需要選取我們所需要的回撥方法來重寫就可以了,非常方便,也減少了程式碼量,符合介面隔離原則,也是模板方法模式的實現。而實現上面的三個介面中的一個都要全部重寫裡面的方法,所以我們一般都是選擇SimpleOnGestureListener。

使用:實現OnGestureListener介面

滑動時方法的呼叫順序:onDown(點選時) -》onScroll(按下)-》 onFling(擡起)

 private static final int SWIPE_MIN_DISTANCE = 120;
		 private static final int SWIPE_MAX_OFF_PATH = 250;
		 private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

我們要實現左右滑動需要三個資料:

SWIPE_MIN_DISTANCE = 120; //表示x軸至少滑動120才會觸發

SWIPE_MAX_OFF_PATH = 250; //表示y軸最多滑動250才會觸發,以保證是在橫向滑動

SWIPE_THRESHOLD_VELOCITY = 200;  //x軸方向的距離


 class  GestureListener implements OnGestureListener{ 
		 private static final int SWIPE_MIN_DISTANCE = 120;
		 private static final int SWIPE_MAX_OFF_PATH = 250;
		 private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
		public boolean onSingleTapUp(MotionEvent e) {
			// TODO Auto-generated method stub
			return false;
		}
             @Override  
             public void onShowPress(MotionEvent e) {  
                // TODO Auto-generated method stub  
  
             }  
   
            @Override  
             public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {  
                 // TODO Auto-generated method stub  
                 return false;  
             }  
   
             @Override  
            public void onLongPress(MotionEvent e) {  
                 // TODO Auto-generated method stub  
             }  

             @Override  
             public boolean onDown(MotionEvent e) {  
                 // TODO Auto-generated method stub  
                 return false;  
             }  

		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {     
			    if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH){ //縱向滑動,返回錯誤
			    	return false;
			    }

			    if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
			           Log.e("Calendar", "left--->right")  ; 
			          return true;                              
			 
			     } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {            
			 
			    	 Log.e("Calendar", "right--->left")  ; 
			    	 return true;
			    	 }
			
		return false;
	}
	
}

當然不要忘記在主函式中實現onTouch,事件分發機制;

下面複習一下ViewGroup和View的onTouch事件分發機制:
接收事件順序:
Activity—->ViewGroup(頁面佈局)—->view或ViewGroup(頁面子佈局)

首先當Activity 收到down事件,會將事件發給viewgroup,viewgroup會判斷自身是否攔截,如果攔截了則自身消費,之後的的move,up事件將交給所攔截的viewgroup處理(除非上一級進行了攔截,則會接收到取消事件),如果不攔截則向子佈局傳遞事件,子view如果return true,則證明消費了改事件,以後的move,up事件將交給改view處理,除非上一級將move或up處理;如果所有佈局均不消費該事件,則會

將所有view或viewgroup走一遍,而後執行Activity的onTouchEvent方法,如果所有檢視層均未消費事件,則以後的move,up事件將全部由Activity消費,不再向下傳遞。
另外,一個事件只能有一個檢視消費,不能多個view或者viewgroup共同消費。
由於網上完整的事件分發機制已經太多太全了,所以本文介紹的比較淺顯,如果大家有疑惑可以去網上搜索事件分發詳解

@Override
	public boolean onTouch(View v, MotionEvent event) {
		
		return mGesture.onTouchEvent(event);
	}


相關推薦

GestureDetector進行左右滑動

GestureDetector介紹  Detector的意思就是探測者,所以GestureDetector就是用來監聽手勢的發生。它內部有3個Listener介面,用來回調不同型別的觸控事件,用一個簡略的類圖來顯示:     裡面這些介面的方法,就是相應觸控事件的回撥,實現了

android 判斷左右滑動,上下滑動GestureDetector簡單手勢檢測

rst 手勢檢測 stat out util androi gen bool ide 直接加入監聽GestureDetector放在需要判斷滑動手勢的地方: 1 import android.app.Activity; 2 import android.os.Bu

小程式頂部tabbar,隨著內容左右滑動tabbar進行聯動

自學小程式時看到京東app上的效果,突發奇想做出來的。 如下圖展示,左右滑動的時候頂部tabbar可以進行聯動參考了該文章,進行了改進http://blog.csdn.net/qq_31383345/article/details/52900835。直接上程式碼:WXML:&

左右滑動

ear window tail this 頁面 事件綁定 one gin 翻頁 點擊向右向左,中間的內容滑動。 這裏介紹的是一個插件。 效果圖: 當點擊向右: 這裏只是舉列子,為了看明白過程,這的寬度給的很大,寫的只是數字。 這個具體可以用來幹什麽,我們可以把div

Android使用GestureDetector實現手勢滑動效果

void tco event else if rate method sta pro 手勢滑動 直接看實例: package com.example.gesturedetector; import android.os.Bundle; import

H5頁面解決左右滑動問題

hidden 頁面 -s name ice 滑動 width 1.0 左右滑動 在head裏面加入. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable

王立平--Gallery:實現圖片的左右滑動

nts mage let warn relative too state roi group <span style="font-size:18px;color:#330033;">package com.main; i

Swift - 使用CollectionView實現圖片Gallery畫廊效果(左右滑動瀏覽圖片)

abs ber pad comment style 即將 使用 ram 數據源 1,效果圖 (1)圖片從左至右橫向排列(只有一行),通過手指拖動可以前後瀏覽圖片。 (2)視圖滾動時,每張圖片根據其與屏幕中心距離的不同,顯示尺寸也會相應地變化。越靠近屏幕中心尺寸就越大,遠離

小程序不定數量左右滑動中間放大輪播圖效果

ice hid amp length dot 更改 import fix absolute 具體的樣式效果(根據後臺傳遞參數更改展示數量) HTML代碼 <!-- 秒拼產品模塊 備選樣式1--> <view style="white-space: n

阻止touchslider事件冒泡,防止左右滑動時出發全局滑動事件

出發 ron 分支 hsl == mov typeof interval stop 最近適用mui開發一個項目,全局有個側滑菜單offCanvasSideScroll,首頁用了一個touchslider插件來實現行的左右滾動 touchslider的當滾動方向與側滑菜單滾動

小程序選項卡,可左右滑動

size var 內容 右滑 tom return else tail tro wxhtml: <view class="swiper-tab">   <view class="tab-item swiper-tab-item {{currentTab=

Android------實現圖片雙擊放大,縮小,左右滑動的多種方式

params getcount androi nullable per try out 多圖 tro 項目中常常有圖片瀏覽功能。像微信朋友圈圖片瀏覽,QQ空間照片瀏覽 的功能。 實現圖片雙擊放大,縮小,左右滑動等效果。 來看看我的效果圖,希望能滿足你的要求 前

Boostrap輪圖片可以左右滑動

ria family asc 簡單的 min left 底部 需要 otc 記得引用Boostrap的js和css html代碼: <div id="Mycarousel" class="carousel slide col-md-12" data-ride="ca

微信小程序左右滑動切換圖片酷炫效果(附效果)

bin select ans for image pac psi border als   開門見山,先上效果吧!感覺可以的用的上的再往下看。   心動嗎?那就繼續往下看!   先上頁面結構吧,也就是wxml文件,其實可以理解成微信自己封裝過的html,這個不多說了,不懂

css - (左右滑動 時,隱藏底部滾動條)

wid src 隱藏 -s class mar AC over html 先上效果圖,如下: 是不是經常看到此類效果? 這裏如果不借用其它框架,單純的利用css 來實現怎麽做呢? 1.這一看就要用到overflow,但是用它會有一個默認的滾動條; 2.那麽重點來了,怎麽解

js移動端左右滑動事件

edt efault nbsp ret rip chm width idt touchend 1 <div id="box" style="width:100%;height:100%;border:1px solid red;"></div>

Android Fragment+Viewpager實現左右滑動和點選 實現DrawerLayout

xml佈局程式碼: <android.support.v4.widget.DrawerLayout xmlns:android=“http://schemas.android.com/apk/res/android” xmlns:app=“http://schemas.androi

QML實現網頁左右滑動的輪播圖效果

網頁中有很多的左右滑動的圖片輪動的效果。QML實現此效果的兩種方式。 PageIndicator和TabBar 也對應兩種樣式。 其中左右滑動的動畫效果是利用SwipeView的預設切換動畫效果 import QtQuick 2.9 import QtQuick.Controls 2.

【12】MUI 仿拼多多 全部訂單(頂部選單欄,可左右滑動,webview模式)

點選此處:MUI仿拼多多總目錄 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-

小程式左右滑動的scroll-view

            wxml: <scroll-view class='scrollView' scroll-x='true'> <view class='cc'> &l