當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 說在前面,很早時,android就開始有支持單點手勢(單點觸控),到android2.2開始支持多點觸控.不同的動作序列合起來表示不同的手勢。比如Fling手勢包括三個過程:將手指按觸在

 說在前面,很早時,android就開始有支持單點手勢(單點觸控),到android2.2開始支持多點觸控.

不同的動作序列合起來表示不同的手勢。比如Fling手勢包括三個過程:將手指按觸在屏幕上,然后快速掃過,最后

抬起手指,并且在抬起手指仍然在運動(也就是說抬起手指前,運動的速度并不會減少).每一個步操作都會觸發(fā)相應(yīng)的事件。

在View控件內(nèi),開發(fā)人員可以像處理普通的單擊事件時使用setOnClickListener()和setOnLongClickListener()

方法一樣處理手勢。onTouchEvent()回調(diào)方法用于探測View區(qū)域內(nèi)的用戶動作。

onTouchEvent()回調(diào)方法只接收一個參數(shù)。MotionEvent對象。MotionEvent對象包含在View內(nèi)觸發(fā)的所有類型動作

的細節(jié),通過收集和分析連續(xù)的MotionEvent對象,開發(fā)人員可以確定產(chǎn)生了何種手勢。你可以使用MotionEvent數(shù)據(jù)

來識別的探測任何你能想像的手勢。不過你也可以使用Android SDK 內(nèi)置的手勢探測器來探測普通的用戶動作。

android目前擁有兩個不同的類用于手勢探測。

(1) GestureDetector類可以用于探測一般的單點觸控手勢。

(2) ScaleGestureDetector可以用來探測多點縮放操作手勢。

除了普通的方向性手勢,你還可以使用API level 4中引入的android.gesture包中的GestureOverlayView來識別命令手勢。

下面主要是處理普通單點觸控手勢

API level 1中引入的GestureDetector類可以用來探測單個手勢。GestureDetector類所支持的單指手勢包括以下幾種。

onDown:當(dāng)用戶第一次按觸屏幕時觸發(fā)。

onShowPress:當(dāng)用戶按觸屏幕,并且在抬起或移動手指之前觸發(fā):用于顯示顯示地指示按觸事件確已探測到。

onSingleTapUp:作為單擊(sinlge-tap)事件的一部分,在用戶從觸屏上抬起手指(使用抬起MotionEvent)時觸發(fā)。

onSingleTabConfirmed:單擊事件發(fā)生時調(diào)用。

onDoubleTab:雙擊(double-tap)事件發(fā)生時調(diào)用。

onDoubleTabEvent:在任何雙擊手勢發(fā)生時調(diào)用,包括按下(down),移動,或抬起(up)MotionEvent.

onLongPress:與onSingleTapUp類似,但只在用戶保持按觸狀態(tài)且不移動一定時間,并且不是標準的單擊操作時調(diào)用。

onScroll:用戶按下手指并且勻速移動手指后,在抬起手指前調(diào)用。通常也稱為“拖曳”(dragging).

onFling:在用戶按下并且加速移動手指后,在抬起手指前調(diào)用,通常也稱為"拂動(flick)手勢。

提示:你可以使用GestureDetector.SimpleOnGestureListener類來監(jiān)聽由GestureDetector識別的任何手勢。

實例:在Android中實現(xiàn)圖片左右滑動效果。

參考來自:

http://www.cnblogs.com/hanyonglu/archive/2012/02/13/2349827.html

原文比較詳細,在此不轉(zhuǎn)。注意的一點就是,為了不帶那些不用的方法,可以繼承SimpleOnGestureListener類。

說一下,我個人的感受。

1.受到一些網(wǎng)上不正確的文章,實習(xí)OnTouchListener了。

結(jié)果,本來應(yīng)該重寫GestureDetector.OnGestureListener接口的

onTouchEvent方法時,實現(xiàn)了onTouch()方法,害我老是看不到效果,這里弄,那里查,結(jié)果,找了開始那本書學(xué)習(xí)。

系統(tǒng)學(xué)習(xí)之后,然后我看源代碼。發(fā)現(xiàn)了GestureDetector類這樣的javadoc:

1/**

2* To use this class:

3 *

     

    4 *

  • Create an instance of the {@code GestureDetector} for your {@link View}

     

    5 *

  • In the {@link View#onTouchEvent(MotionEvent)} method ensure you call

     

    6 * {@link #onTouchEvent(MotionEvent)}. The methods defined in your callback

    7 * will be executed when the events occur.

    8 *

 

9**/

上面那個ensure讓我覺得應(yīng)該檢查下是不是實現(xiàn)了。然后,結(jié)果就出來了。哈哈。太不小心了。

關(guān)于判斷手勢效果的代碼:

1Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT);

2 if (e1.getX() - e2.getX() > 120) {

3 this.mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));

4 this.mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));

5this.mFlipper.showNext();

6 return true;

7 }

1.上面觸發(fā)事件時,我寫有Toast提醒代碼,但是實際上,用戶看不到。

2.第二 上面判斷手勢距離要求120px有點大長了。

下面學(xué)習(xí)下其中起到關(guān)鍵作用的另外一個類。ViewFlipper.

ViewFlipper的類繼承關(guān)系如下:

ViewFlipper->ViewAnimator->FrameLayout->ViewGroup->View->Object

看一下類描述:(中文翻譯來自Android中文翻譯組)

1/**

2 * Simple {@link ViewAnimator} that will animate between two or more views

3 * that have been added to it. Only one child is shown at a time. If

4 * requested, can automatically flip between each child at a regular interval.

5 *

6被添加到ViewFlipper中的兩個或兩個以上的視圖之間將執(zhí)行一個簡單的ViewAnimator動畫。

1一次僅能顯示一個子視圖。如果需要,可以設(shè)置間隔時間使子視圖像幻燈片一樣自動顯示。

1(譯者注:com.example.android.apis.view/Animation_2.java包含該類示例程序)

2

3 * @attr ref android.R.styleable#ViewFlipper_flipInterval

4 * @attr ref android.R.styleable#ViewFlipper_autoStart

5 */

經(jīng)過使用SimpleOnGestureListener類后的全部Java代碼如下:

01package me.banxi.slideapp;

02

03import android.app.Activity;[!--empirenews.page--]

04import android.os.Bundle;

05import android.util.Log;

06import android.view.GestureDetector;

07import android.view.GestureDetector.OnGestureListener;

08import android.view.MotionEvent;

09import android.view.View;

10import android.view.View.OnTouchListener;

11import android.view.animation.AnimationUtils;

12import android.widget.ImageView;

13import android.widget.Toast;

14import android.widget.ViewFlipper;

15

16public class SlideAndGestureActivity extends Activity {

17 private ViewFlipper mFlipper;

18 private GestureDetector mDetector;

19 /** Called when the activity is first created. */

20 @Override

21 public void onCreate(Bundle savedInstanceState) {

22 super.onCreate(savedInstanceState);

23 setContentView(R.layout.slide);

24

25 mDetector = new GestureDetector(getApplicationContext(),new FlingListener());

26 mFlipper = (ViewFlipper )findViewById(R.id.viewFlipper1);

27

28 mFlipper.addView(addTextView(R.drawable.one));

29 mFlipper.addView(addTextView(R.drawable.two));

30 mFlipper.addView(addTextView(R.drawable.three));

31 mFlipper.addView(addTextView(R.drawable.four));

32 mFlipper.addView(addTextView(R.drawable.five));

33

34 }

35

36 private View addTextView(int resId){

37 ImageView view = new ImageView(this);

38 view.setImageResource(resId);

39 return view;

40 }

41

42 @Override

43 public boolean onTouchEvent(MotionEvent event) {

44 return mDetector.onTouchEvent(event);

45 }

46

47 private class FlingListener extends GestureDetector.SimpleOnGestureListener{

48 @Override

49 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

50 float velocityY) {

51 String msg = "e1:"+e1.getX()+","+e1.getY()+"e2:"+e2.getX()+","+e2.getY();

52 Log.i("MotionSlide", msg);

53 if (e1.getX() - e2.getX() > 120) {

54 mFlipper.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_in));

55 mFlipper.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_out));

56 mFlipper.showNext();

57 return true;

58 } else if (e1.getX() - e2.getX() < -120) {

59 mFlipper.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_in));

60 mFlipper.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_out));

61 mFlipper.showPrevious();

62 return true;

63 }

64 return false;

65 }

66

67 }

68

69}

在實際的項目開發(fā)中會遇到這樣一樣問題。

比如。上面 例子添加的ImageView默認也許不處理事件。所以 可以 正常的滑動。

但是在我的實際的開發(fā)中,的發(fā)現(xiàn)如ViewFlipper上面有一個GridView,GridView上面排列有Button.然后滑動手勢

的事件就不會傳播到ViewFlipper中去啊。于是我開始是在GridView上面 設(shè)置 一個margin

在margin區(qū)域里滑動事件 就會傳遞給ViwFlipper。(嚴格來說應(yīng)該是mDetecotor.onTouchEvent()中去。

然后我就在想這個事件 傳播的問題,然后我想到因為其實主要調(diào)用mDetecotor的時候,

也是在Activity中的OnTouchEvent(MotionEvent)方法 中。

中將這個MotionEvent事件以這樣return mDetector.onTouchEvent(event)方法處理返回 。

于是 想在button中事件中的ACTION_MOVE中也調(diào)用mDetector.OnTouchEvent()

但是結(jié)果 不行。后來我就不區(qū)分ACTION_MOVE等等了。

于是,最后,我在對button和gridView做了如下處理。

1button.setOnTouchListener(new OnTouchListener() {

2 @Override

3 public boolean onTouch(View v, MotionEvent event) {

4 return mDetector.onTouchEvent(event);

5

6 }

7});

1gridView.setOnTouchListener(new OnTouchListener() {

2 @Override

3 public boolean onTouch(View v, MotionEvent event) {

4 return mDetector.onTouchEvent(event);

5 }

6});

我想,因為Fliing這樣事件不僅僅是ACTION_MOVE他還有開始的OnDown等等一系列事件組合起來的。

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

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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