當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 當(dāng)用戶觸摸屏幕的時(shí)候,會(huì)產(chǎn)生許多手勢(shì),例如down,up,scroll,filing等等。一般情況下,我們知道View類有個(gè)View.OnTouchListener內(nèi)部接口,通過重寫他的onTouch(View v,

 當(dāng)用戶觸摸屏幕的時(shí)候,會(huì)產(chǎn)生許多手勢(shì),例如down,up,scroll,filing等等。

一般情況下,我們知道View類有個(gè)View.OnTouchListener內(nèi)部接口,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個(gè)方法太過簡單,如果需要處理一些復(fù)雜的手勢(shì),用這個(gè)接口就會(huì)很麻煩(因?yàn)槲覀円约焊鶕?jù)用戶觸摸的軌跡去判斷是什么手勢(shì))。

Android sdk給我們提供了GestureDetector(Gesture:手勢(shì)Detector:識(shí)別)類,通過這個(gè)類我們可以識(shí)別很多的手勢(shì),主要是通過他的onTouchEvent(event)方法完成了不同手勢(shì)的識(shí)別。雖然他能識(shí)別手勢(shì),但是不同的手勢(shì)要怎么處理,應(yīng)該是提供給程序員實(shí)現(xiàn)的。

GestureDetector這個(gè)類對(duì)外提供了兩個(gè)接口:OnGestureListener,OnDoubleTapListener,還有一個(gè)內(nèi)部類SimpleOnGestureListener。

GestureDetector.OnDoubleTapListener接口:用來通知DoubleTap事件,類似于鼠標(biāo)的雙擊事件。

1,onDoubleTap(MotionEvent e):在雙擊的第二下,Touch down時(shí)觸發(fā) 。

2,onDoubleTapEvent(MotionEvent e):通知DoubleTap手勢(shì)中的事件,包含down、up和move事件(這里指的是在雙擊之間發(fā)生的事件,例如在同一個(gè)地方雙擊會(huì)產(chǎn)生DoubleTap手勢(shì),而在DoubleTap手勢(shì)里面還會(huì)發(fā)生down和up事件,這兩個(gè)事件由該函數(shù)通知);雙擊的第二下Touch down和up都會(huì)觸發(fā),可用e.getAction()區(qū)分。

3,onSingleTapConfirmed(MotionEvent e):用來判定該次點(diǎn)擊是SingleTap而不是DoubleTap,如果連續(xù)點(diǎn)擊兩次就是DoubleTap手勢(shì),如果只點(diǎn)擊一次,系統(tǒng)等待一段時(shí)間后沒有收到第二次點(diǎn)擊則判定該次點(diǎn)擊為SingleTap而不是DoubleTap,然后觸發(fā)SingleTapConfirmed事件。這個(gè)方法不同于onSingleTapUp,他是在GestureDetector確信用戶在第一次觸摸屏幕后,沒有緊跟著第二次觸摸屏幕,也就是不是“雙擊”的時(shí)候觸發(fā)

GestureDetector.OnGestureListener接口:用來通知普通的手勢(shì)事件,該接口有如下六個(gè)回調(diào)函數(shù):

1. onDown(MotionEvent e):down事件;

2. onSingleTapUp(MotionEvent e):一次點(diǎn)擊up事件;在touch down后又沒有滑動(dòng)

(onScroll),又沒有長按(onLongPress),然后Touchup時(shí)觸發(fā)。

點(diǎn)擊一下非常快的(不滑動(dòng))Touchup:

onDown->onSingleTapUp->onSingleTapConfirmed

點(diǎn)擊一下稍微慢點(diǎn)的(不滑動(dòng))Touchup:

onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

3. onShowPress(MotionEvent e):down事件發(fā)生而move或則up還沒發(fā)生前觸發(fā)該

事件;Touch了還沒有滑動(dòng)時(shí)觸發(fā)(與onDown,onLongPress)比較onDown只要Touch down一定立刻觸發(fā)。而Touchdown后過一會(huì)沒有滑動(dòng)先觸發(fā)onShowPress再是onLongPress。所以Touchdown后一直不滑動(dòng)

按照onDown->onShowPress->onLongPress這個(gè)順序觸發(fā)。

4. onLongPress(MotionEvent e):長按事件;Touch了不移動(dòng)一直Touch down時(shí)觸發(fā)

5. onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑動(dòng)手

勢(shì)事件;Touch了滑動(dòng)一點(diǎn)距離后,在ACTION_UP時(shí)才會(huì)觸發(fā)

參數(shù):e1 第1個(gè)ACTION_DOWN MotionEvent 并且只有一個(gè);e2 最后一個(gè)ACTION_MOVE MotionEvent ;velocityX X軸上的移動(dòng)速度,像素/秒 ;velocityY Y軸上的移動(dòng)速度,像素/秒.觸發(fā)條件:X軸的坐標(biāo)位移大于FLING_MIN_DISTANCE,且移動(dòng)速度大于FLING_MIN_VELOCITY個(gè)像素/秒

6. onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上

拖動(dòng)事件。無論是用手拖動(dòng)view,或者是以拋的動(dòng)作滾動(dòng),都會(huì)多次觸發(fā),這個(gè)方法在ACTION_MOVE動(dòng)作發(fā)生時(shí)就會(huì)觸發(fā)

拋:手指觸動(dòng)屏幕后,稍微滑動(dòng)后立即松開

onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling

拖動(dòng)

onDown------》onScroll----》onScroll------》onFiling

SimpleOnGestureListener類是GestureDetector提供給我們的一個(gè)更方便的響應(yīng)不同手勢(shì)的類,這個(gè)類實(shí)現(xiàn)了上述兩個(gè)接口(但是所有的方法體都是空的),該類是static class,也就是說它實(shí)際上是一個(gè)外部類。程序員可以在外部繼承這個(gè)類,重寫里面的手勢(shì)處理方法。

方法步驟

第一種示例:

1,通過GestureDetector的構(gòu)造方法可以將SimpleOnGestureListener對(duì)象傳遞進(jìn)去,這樣GestureDetector能處理不同的手勢(shì)了。

public GestureDetector

(Context context, GestureDetector.OnGestureListener listener)

2,在OnTouchListener的onTouch方法中

private OnTouchListener gestureTouchListener = new OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {

return gDetector.onTouchEvent(event);

}

};

第二種示例:

使用方法

private GestureDetector mGestureDetector;

mGestureListener = new BookOnGestureListener();

構(gòu)造出來mGestureDetector = new GestureDetector(mGestureListener);

class BookOnGestureListener implements OnGestureListener {

同時(shí)要public boolean onTouchEvent(MotionEvent event) {

mGestureListener.onTouchEvent(event);

}

第三種示例代碼

代碼:

01.private GestureDetector mGestureDetector;

02.@Override

03.public void onCreate(Bundle savedInstanceState) {

04. super.onCreate(savedInstanceState);

05. mGestureDetector = new GestureDetector(this, new LearnGestureListener());

06.}

07.@Override

08.public boolean onTouchEvent(MotionEvent event) {

09. if (mGestureDetector.onTouchEvent(event))

10. return true;

[!--empirenews.page--]

11. else

12. return false;

13.}

14.class LearnGestureListener extends GestureDetector.SimpleOnGestureListener{

15. @Override

16. public boolean onSingleTapUp(MotionEvent ev) {

17. Log.d("onSingleTapUp",ev.toString());

18. return true;

19. }

20. @Override

21. public void onShowPress(MotionEvent ev) {

22. Log.d("onShowPress",ev.toString());

23. }

24. @Override

25. public void onLongPress(MotionEvent ev) {

26. Log.d("onLongPress",ev.toString());

27. }

28. @Override

29. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {

30. Log.d("onScroll",e1.toString());

31. return true;

32. }

33. @Override

34. public boolean onDown(MotionEvent ev) {

35. Log.d("onDownd",ev.toString());

36. return true;

37. }

38. @Override

39. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

40. Log.d("d",e1.toString());

41. Log.d("e2",e2.toString());

42. return true;

43. }

44.}

1,在當(dāng)前類中創(chuàng)建一個(gè)GestureDetector實(shí)例。

private GestureDetector mGestureDetector;

2,創(chuàng)建一個(gè)Listener來實(shí)時(shí)監(jiān)聽當(dāng)前面板操作手勢(shì)。

class LearnGestureListener extends GestureDetector.SimpleOnGestureListener

3,在初始化時(shí),將Listener實(shí)例關(guān)聯(lián)當(dāng)前的GestureDetector實(shí)例。

mGestureDetector = new GestureDetector(this, new LearnGestureListener());

4,利用onTouchEvent方法作為入口檢測(cè),通過傳遞MotionEvent參數(shù)來監(jiān)聽操作手勢(shì)。

1.mGestureDetector.onTouchEvent(event)

第四種示例代碼

private GestureDetector mGestureDetector;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mGestureDetector = new GestureDetector(this, new MyGestureListener());

}

@Override

public boolean onTouchEvent(MotionEvent event) {

return mGestureDetector.onTouchEvent(event);

}

class MyGestureListener extends GestureDetector.SimpleOnGestureListener{

@Override

public boolean onSingleTapUp(MotionEvent ev) {

Log.d("onSingleTapUp",ev.toString());

return true;

}

@Override

public void onShowPress(MotionEvent ev) {

Log.d("onShowPress",ev.toString());

}

@Override

public void onLongPress(MotionEvent ev) {

Log.d("onLongPress",ev.toString());

}

}

基本的內(nèi)容就是創(chuàng)建一個(gè)GestureDetector的對(duì)象,傳入listener對(duì)象,在自己接收到的onTouchEvent中將event傳給GestureDetector進(jìn)行分析,listener會(huì)回調(diào)給我們相應(yīng)的動(dòng)作。其中GestureDetector.SimpleOnGestureListener(Framework幫我們簡化了)是實(shí)現(xiàn)了上面提到的OnGestureListener和OnDoubleTapListener兩個(gè)接口的類,我們只需要繼承它并重寫其中我們關(guān)心的回調(diào)即可。

最后,再提一下雙擊和三擊的識(shí)別過程:在第一次單擊down時(shí),給Hanlder發(fā)送了一個(gè)延時(shí)300ms的消息,如果300ms里,發(fā)生了第二次單擊的down事件,那么,就認(rèn)為是雙擊事件了,并移除之前發(fā)送的延時(shí)消息。如果300ms后仍沒有第二次的down消息,那么就判定為SingleTapConfirmed事件(當(dāng)然,此時(shí)用戶的手指應(yīng)已完成第一次點(diǎn)擊的up過程)。三擊的判定和雙擊的判定類似,只是多了一次發(fā)送延時(shí)消息的過程。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉