Android手勢學習之單點手勢
說在前面,很早時,android就開始有支持單點手勢(單點觸控),到android2.2開始支持多點觸控.
本文引用地址:http://m.butianyuan.cn/article/201610/305460.htm不同的動作序列合起來表示不同的手勢。比如Fling手勢包括三個過程:將手指按觸在屏幕上,然后快速掃過,最后
抬起手指,并且在抬起手指仍然在運動(也就是說抬起手指前,運動的速度并不會減少).每一個步操作都會觸發(fā)相應的事件。
在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:當用戶第一次按觸屏幕時觸發(fā)。
onShowPress:當用戶按觸屏幕,并且在抬起或移動手指之前觸發(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)上不正確的文章,實習OnTouchListener了。
結(jié)果,本來應該重寫GestureDetector.OnGestureListener接口的
onTouchEvent方法時,實現(xiàn)了onTouch()方法,害我老是看不到效果,這里弄,那里查,結(jié)果,找了開始那本書學習。
系統(tǒng)學習之后,然后我看源代碼。發(fā)現(xiàn)了GestureDetector類這樣的javadoc:
1/**
2* To use this class:
3 *
- 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 *
4 *
9**/
上面那個ensure讓我覺得應該檢查下是不是實現(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有點大長了。
下面學習下其中起到關(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一次僅能顯示一個子視圖。如果需要,可以設置間隔時間使子視圖像幻燈片一樣自動顯示。
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;
評論