在和手機屏幕進行交互的過程中,我們存在多種多樣的手勢,想比如單擊,雙擊,滑動,兩指的縮放,那么Android是怎么對我們的手勢進行監(jiān)聽的呢?通過本篇文章的學(xué)習(xí),你講對Android手勢處理有個大致的了解:

創(chuàng)新互聯(lián)擁有網(wǎng)站維護技術(shù)和項目管理團隊,建立的售前、實施和售后服務(wù)體系,為客戶提供定制化的做網(wǎng)站、成都網(wǎng)站設(shè)計、網(wǎng)站維護、資陽服務(wù)器托管解決方案。為客戶網(wǎng)站安全和日常運維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護服務(wù)覆蓋集團企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球近千家企業(yè)提供全方位網(wǎng)站維護、服務(wù)器維護解決方案。
1.Android系統(tǒng)提供的手勢監(jiān)聽器OnGestureListener
2.Android系統(tǒng)提供的手勢監(jiān)聽器SimpleOnGestureListener
3.onTouchEvent自己去識別各種手勢
1.activity實現(xiàn)這個接口需要重寫一下方法:
這些函數(shù)在什么時候會觸發(fā):
onDown(MotionEvent motionEvent) :用戶按下屏幕就會觸發(fā)
onShowPress(MotionEvent motionEvent) :如果是按下的時間超過瞬間,而且在按下的時候沒有松開或者是拖動的,那么onShowPress就會執(zhí)行,這個瞬間無法定義
onLongPress(MotionEvent e) :長按觸摸屏,超過一定時長,就會觸發(fā)這個事件
onSingleTapUp(MotionEvent motionEvent) :從名子也可以看出,一次單獨的輕擊抬起操作,也就是輕擊一下屏幕,立刻抬起來,才會有這個觸發(fā),當(dāng)然,如果除了Down以外還有其它操作,那就不再算是Single操作了,所以也就不會觸發(fā)這個事件
onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) :滑屏,用戶按下觸摸屏、快速移動后松開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發(fā)
onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) :在屏幕上拖動事件
最后兩個方法有點類似,四個參數(shù)的意義也一樣:
motionEvent:第1個ACTION_DOWN MotionEvent
motionEvent1:最后一個ACTION_MOVE MotionEvent
v:X軸上的移動速度,像素/秒
v1:Y軸上的移動速度,像素/秒
2.創(chuàng)建手勢類,并重寫onTouchEvent方法,把onTouchEvent托管給手勢類
滑動的時候會調(diào)用: onDown-----》onScroll----》onScroll----》onScroll----》………-----onFling
單擊:onDown---》onSingleTapUp
雙擊:onDown---》onSingleTapUp---》onDown---》onSingleTapUp
SimpleOnGestureListener手勢監(jiān)聽器相比于OnGestureListener監(jiān)聽器的優(yōu)點在于不需要重寫所有方法,只需要關(guān)注自己想要點方法即可,而且它還包含了下面OnDoubleTapListener監(jiān)聽器單雙擊的方法,因此一般情況下用這個監(jiān)聽器最好:
同時,有一個OnDoubleTapListener是只需要關(guān)注單擊和雙擊事件的:
可以通過重寫onTouchEvent方法獲取event.getAction()得到手指的狀態(tài),按下,移動,抬起,判斷是一根手指的時候就是拖動狀態(tài),可以用于模仿微信拖動圖片拖動到下方然后消失,判斷是兩根手指的時候就是縮放狀態(tài),用于模仿微信雙手縮放圖片根據(jù)判斷兩根手指的距離是增加還是減少進行放大和縮小。
以上就是關(guān)于Android手勢處理的相關(guān)知識點,如有不足或者錯誤的地方請在下方指正。我們需要多看更需要多寫,只有不斷學(xué)習(xí),不斷進步才能不被淘汰。
android手勢沖突解決方法如下:
方法一:如代碼中含有ViewFlipper、ScrollView、ViewPager等有手勢反應(yīng)的組件,且是用FrameLayout包裹的;但卻只想觸發(fā)其中某個組件的手勢反應(yīng),建議用View.setVisibility()方法,屏蔽掉ViewFlipper、ScrollView、ViewPager等有手勢反應(yīng)組件(比如ViewFlipper.setVisibility()),到合適的時候,再將被屏蔽的組件顯示出來。
方法二:如代碼中含有ViewFlipper、ScrollView、ViewPager等有手勢反應(yīng)的組件;
但卻想根據(jù)不同的手勢觸發(fā)不同的組件手勢反應(yīng),建議繼承并重寫以上組件,并用ViewGroup.onInterceptTouchEvent方法,攔截所有手勢,進而根據(jù)不同的手勢觸發(fā)不同的組件。
首先,在Android系統(tǒng)中,每一次手勢交互都會依照以下順序執(zhí)行。
1. 接觸接觸屏一剎那,觸發(fā)一個MotionEvent事件。
2. 該事件被OnTouchListener監(jiān)聽,在其onTouch()方法里獲得該MotionEvent對象。
3. 通過GestureDetector(手勢識別器)轉(zhuǎn)發(fā)次MotionEvent對象至OnGestureListener。
4. OnGestureListener獲得該對象,聽根據(jù)該對象封裝的的信息,做出合適的反饋。
這個順序可以說就是手勢交互的原理,下面一同來了解一下MotionEvent、GestureDetector和OnGestureListener。
MotionEvent: 這個類用于封裝手勢、觸摸筆、軌跡球等等的動作事件。其內(nèi)部封裝了兩個重要的屬性X和Y,這兩個屬性分別用于記錄橫軸和縱軸的坐標(biāo)。
GestureDetector: 識別各種手勢。
OnGestureListener: 這是一個手勢交互的監(jiān)聽接口,其中提供了多個抽象方法,并根據(jù)GestureDetector的手勢識別結(jié)果調(diào)用相對應(yīng)的方法。
下面我再通過一個切換圖片的代碼示例,演示一下手勢交互的實現(xiàn),讓大伙對上面的執(zhí)行順序,以及各手勢動作的區(qū)分有一個更加深刻的了解和記憶。
首先,提供一個只有ImageView的布局文件——main.xml。
1
2
3
4
5
6
7
8
9
10
11
?xml
version="1.0"
encoding="utf-8"?
LinearLayout
xmlns:android=""
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"/
然后,完成我們的Activity,因為要監(jiān)聽觸摸屏的觸摸事件和手勢時間,所以該Activity必須實現(xiàn)OnTouchListener和OnGestureListener兩個接口,并重寫其中的方法。具體代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public
class MainActivity extends Activity implements OnTouchListener, OnGestureListener {
//創(chuàng)建一個用于識別收拾的GestureDetector對象waiyuwu.blogcn.com
private
GestureDetector detector = new
GestureDetector(this);
//定義一個數(shù)組,用于放漂亮的女孩
int[]
girls = new
int[]{R.drawable.girl1, R.drawable.girl2, R.drawable.girl3};
//定義數(shù)組下標(biāo),以方便觀看各個女孩
private
int index;
private
ImageView image;
@Override
public
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
image
= (ImageView)findViewById(R.id.image);
//設(shè)置一個初始顯示的girl吧
image.setImageResource(girls[index]);
//監(jiān)聽這個ImageView組件上的觸摸屏?xí)r間
image.setOnTouchListener(this);
//下面兩個要記得設(shè)哦,不然就沒法處理輕觸以外的事件了,例如拋擲動作。
image.setLongClickable(true);
detector.setIsLongpressEnabled(true);
}//用于呼喊下一個女孩的方法
public
void goNext(){
index++;
index
= Math.abs(index % girls.length);
image.setImageResource(girls[index]);
}
//重寫OnTouchListener的onTouch方法
//此方法在觸摸屏被觸摸,即發(fā)生觸摸事件(接觸和撫摸兩個事件,挺形象)的時候被調(diào)用。
@Override
public
boolean onTouch(View v, MotionEvent event) {
detector.onTouchEvent(event);
return
true;
}
//在按下動作時被調(diào)用
@Override
public
boolean onDown(MotionEvent e) {
return
false;
}
//在拋擲動作時被調(diào)用
@Override
public
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float
velocityY) {
//velocityX表示橫向的移動,根據(jù)手指移動的方向切換女孩
if(velocityX
0){
goNext();
}else
if(velocityX
0){
goPrevious();
}
return
false;
}
//用戶呼喚上一個女孩的方法
public
void goPrevious(){
index--;
index
= Math.abs(index % girls.length);
image.setImageResource(girls[index]);
}
//在長按時被調(diào)用
@Override
public
void onLongPress(MotionEvent e) {
}
//在滾動時調(diào)用
@Override
public
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float
distanceY) {
return
false;
}
//在按住時被調(diào)用
@Override
public
void onShowPress(MotionEvent e) {
}
//在抬起時被調(diào)用
@Override
public
boolean onSingleTapUp(MotionEvent e) {
return
false;
}
}
在剛開始學(xué)Android的時候,就覺得Google的文檔不咋樣,在研究手勢時,更加的感覺Google的文檔寫得實在是太差了。很多常量, 屬性和方法,居然連個描述都沒有。沒有描述也就罷了,但是OnGestureListener里手勢這么多,它也沒有一個介紹說明,在沒有進行不斷才嘗試 之前,誰能搞懂onLongPress和onShowPress,onScroll和onFling的關(guān)系與差別嗎?Google真的需要在文檔方面做一 次大手術(shù)了。不過好在經(jīng)過鄙人不斷反復(fù)的嘗試。從個人的角度為這幾個手勢動作做出了定義。
按下(onDown): 剛剛手指接觸到觸摸屏的那一剎那,就是觸的那一下。
拋擲(onFling): 手指在觸摸屏上迅速移動,并松開的動作。
長按(onLongPress): 手指按在持續(xù)一段時間,并且沒有松開。
滾動(onScroll): 手指在觸摸屏上滑動。
按住(onShowPress): 手指按在觸摸屏上,它的時間范圍在按下起效,在長按之前。
抬起(onSingleTapUp):手指離開觸摸屏的那一剎那。
除了這些定義之外,鄙人也總結(jié)了一點算是經(jīng)驗的經(jīng)驗吧,在這里和大家分享一下。
任何手勢動作都會先執(zhí)行一次按下(onDown)動作。
長按(onLongPress)動作前一定會執(zhí)行一次按住(onShowPress)動作。
按住(onShowPress)動作和按下(onDown)動作之后都會執(zhí)行一次抬起(onSingleTapUp)動作。
長按(onLongPress)、滾動(onScroll)和拋擲(onFling)動作之后都不會執(zhí)行抬起(onSingleTapUp)動作。
android手機有哪些手勢操作:
“點擊”,也叫“單擊”,即輕觸屏幕一下。無論是搭載何種操作系統(tǒng)的觸控手機,這個都是出現(xiàn)頻率最高的動作。點擊主要用來打開程序,還有功能表(抽屜)。
“點住”,也叫“長按”、“按住”,按住屏幕超過兩秒。此動作通常用來調(diào)出“菜單”。某些應(yīng)用程序在界面空白處長按可以調(diào)出菜單;某些條目長按也可以彈出菜單,比如當(dāng)您需要轉(zhuǎn)發(fā)短信時,在短信對話界面長按短信內(nèi)容,必然會彈出菜單,菜單中通常會有“轉(zhuǎn)發(fā)”選項。
在進行文字編輯時,點住文字部分,然后調(diào)出光標(biāo)進行精準(zhǔn)定位。
當(dāng)然,此動作也可用于多選、快捷視圖,比如在“圖庫(相冊)”中,默認(rèn)視圖下,長按相冊文件夾、可對文件夾進行多選操作;打開相冊文件夾后,長按照片,同樣可對照片進行多選操作,選擇完畢后可進行批量操作(發(fā)送、刪除)。
“拖動”,準(zhǔn)確來說應(yīng)該叫做“按住并拖動”。“拖動”主屏幕編輯時的常見動作,比如對桌面“小組件”或者“圖標(biāo)”進行位置編輯時。另外也用于進度定位,比如播放音樂或者視頻時,需要常常拖動進度條。
“雙擊”就是短時間內(nèi)連續(xù)雙擊屏幕兩次,主要用于快速縮放,比如瀏覽圖片時雙擊可以快速放大,再次雙擊可以復(fù)位;瀏覽網(wǎng)頁時,對文章正文部分雙擊可使文字自適應(yīng)屏幕,當(dāng)然某些視頻播放器雙擊可切換至全屏模式。
滑動,也算是一個常見操作。主要用于查看屏幕無法完全顯示的頁面,功能類似鼠標(biāo)的滾輪。此操作主要用于查看圖片、網(wǎng)頁、純文本(短信、郵件、筆記)。
某些視頻播放器還定義了特殊功能,比如亮度調(diào)節(jié)、快進快退,比如“MX Player”、“VPlayer”。
“縮放”動作,是查看圖片、網(wǎng)頁時最常見的操作,照相時也可使用縮放手勢來進行調(diào)焦。在MX Player中,甚至可以將視頻畫面進行縮放。
新聞名稱:手勢android,手勢舞教程視頻
分享網(wǎng)址:http://chinadenli.net/article26/dsepgcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、全網(wǎng)營銷推廣、定制網(wǎng)站、Google、云服務(wù)器、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)