著者:陳ヤン哲エッジ&
それは私に尋ねた同僚から発信:「どのようにエレガントなリスナーをダブルクリックし、」この行動を?
時には完全にシステムにいくつかの問題を持っている能力、我々は簡単に望んでいた機能を実現する可能性があるため、実際には、多くの同様のイベントに関連する、我々は、システムのソースコードを参照することができます。
上記の例の同僚は尋ねました:
どのようにエレガントなリスナーをダブルクリックしますか?
しかし私は、システムがで私たちを提供している、私たちは多かれ少なかれいくつかの実装を持っていると信じていGestureDetector
たコードの承認が改善されます、あなたは、このような実現に精通している場合、システムは同じプログラムのために選択することができます、クラス。
だから、今日、私たちは下学ぶ機会を持っています:
GestureDetector
どのようにサポートジェスチャーについて検出されましたか?
ここでは、小さなエッジコンテンツ分析があります。
私たちは、クラスのインスタンスを作成し、インターフェイスに必要OnGestureListener
とコンストラクタに渡されたパラメータとしてそれを実装(ジェスチャーの様々なを監視するために使用):
各コールバックメソッド(理解することは非常に簡単)のタイミングを説明します:
-
onDown
:フィンガープレス; -
onShowPress
:指が押された後、100ミリ秒以内に発生しません、移動されません。 -
onSingleTapUp
:押して、指が移動されていない、とリフトは500ミリ秒以内(クリックすると識別することができます)。 -
onScroll
:指をドラッグします。 -
onLongPress
:長押し(プレス指、移動していない500ミリ秒、以内に発生しません)。 -
onFling
:すぐに(慣性スクロールを)手放す指をドラッグした後、
またOnGestureListener
、あるOnDoubleTapListener
監視するために使用される名前を推測することができ参照イベントをダブルクリックします。
説明:
-
onSingleTapConfirmed
:私は、これがクリックイベントであることを確認した(すなわち:リフト指の後に、300ミリ秒の指が再び押され待ちませんでした)ダブルクリックで素早くダブルタップする画面を継続しなければならないトリガします。 -
onDoubleTap
:ダブルクリックし、トリガ・イベント(指を持ち上げた後、300ミリ秒(注以内に再度押す:もう一度押すとそれがトリガされ、それがトリガーの前に提起されなかったので)) -
onDoubleTapEvent
:含めてダブルクリックし、後のトリガー指のタッチイベントACTION_DOWN
、ACTION_MOVE
(注:ACTION_UP
長押しをトリガした後、引き続き受信しませんACTION_MOVE
指プレス工程は、プロセスが直接である指の動きの動きを必要としないため、イベントを無視するACTION_MOVE
イベントを。また、この後のコールバックメソッドを、長押しイベントをトリガする前に、新しい指が押された場合、それはもはやダブルクリックとして識別され、それがこのメソッドにコールバックしていきませんでしょう、それが置き換えonScroll
)。上記でこのアプローチonDoubleTap
方法の違いは、それであるonDoubleTap
一度だけダブルクリックコールバックのイベントでは、この方法は、時間をコールバックすることができます。
まあ、それは予備的な理解後に、それを見てみましょうすると、これらのイベントを検出する方法ですしています。
1、onDown
コードのこのクラスのまれ、800本の未満の線(SDK28)。
ときにコールバック(単にインターフェースメソッドで利用できる方法onDownまず外観はあるCTRL + Click
特定のコールを検索する場所に対応するメソッド名):
スーパーシンプルな、を聞いてACTION_DOWN
すぐに引き戻されたイベント。
2、onShowPress
そして、見てみましょうonShowPress
(見つけるために今言った方法を使用して)方法:
それはされますGestureHandler
受信what
のためSHOW_PRESS
のニュースのどこ髪確認するために、次のメッセージコールバック:
emmmもの受信にACTION_DOWN
意志mHandler
(すなわち、GestureHandler
時間を指定するメッセージ、及びこの時間がプラス時間の押下された送信)TAP_TIMEOUT
期間見られるTAP_TIMEOUT
値をに基づいて取得する方法と、開口外観:ViewConfiguration
getTapTimeout
遅延は、このタスクが100ミリ秒以内にキャンセルされていない場合は、その後、指を押したときに、あること、100(ミリ秒)であるonShowPress
メソッドがコールバックされます。
3、onSingleTapUp&onScroll
OK、今を見てみましょうonSingleTapUp
:
あなたはそれがであることを確認することができACTION_UP
、時間のコールバック、コールバックはすなわち、三つの条件を満たしている必要があります。
falseに1.mIsDoubleTapping(すなわち、ダブルクリックしてイベントがトリガされません)。
falseに2.mInLongPress(すなわち長押しイベントがトリガされません)。
3.mAlwaysInTapRegion为はtrue。
mAlwaysInTapRegion
何時間それがtrue
何であるかを時間、false
それは:
3ヶ所の割り当ては、すなわち、があります。
1. ACTION_POINTER_DOWN
(別の指プレス)がある場合はfalse
、それが唯一の最初の指が押された場合、100ミリ秒は、新しい指プレスがある、と言うことです、そして時にリフトしませんばね指onSingleTapUp
。
2. ACTION_DOWN
とき(最初の指プレス)true
;
3. ACTION_MOVE
見ると、else if
その内部にはif
、それが判断されるdistance
よりも大きい(指の移動距離)slopSquare
(最小トリガ距離が移動)、そうであればれるコールバックonScroll
メソッド、およびmAlwaysInTapRegion
セットfalse
指100を押下された場合、そのことを示し、秒以内に、その後、ドラッグを始めたonSingleTapUp
メソッドがコールバックではありません。
また、時に見ることができますmAlwaysInTapRegion
設定されているfalse
次回の後にACTION_MOVE
何のトリガが存在しない場合(上記すなわち、ダブルクリック、時間が来るmIsDoubleTapping为false
)と指の距離の水平または垂直の動きが0ではありません、そして、それがコールバックされているだろうonScroll
方法。
さて、今onScroll
、また、電源を入れスポークonLongPress
アップ。
4、onLongPress
今onShowPress
の手段によって同じ方法でHandler
メッセージを達成するためのタイミング機構は、それが受信されLONG_PRESS
、メッセージの後に呼び出すdispatchLongPress
方法を、dispatchLongPress
本方法は、第1のマークうmInLongPress
としてtrue
(注:これはのトップに来るときこれが影響しますonSingleTapUp
ので、コールバックonSingleTapUp
コールバックの条件が必要であるmInLongPress
とfalse
(すなわち長押しがトリガされません))
その後、コールバックonLongPress
メソッドを。
だから、LONG_PRESS
ときにそれを送信するメッセージは?
また、時ACTION_DOWN
の時間:
メッセージを送信する前に、第1のモニタがプレスイベントになっているかどうかを確認だけでなく、プレス補正を発行し、取り消し後のタスクを実行しなかっただろう。
与えられた時間、あなたはイベント時間プラスダウン見ることができgetLongPressTimeout
、指が半分秒押しすると、ある長さのメソッドが返すデフォルトは500(ミリ秒)であるが、onLongPress
この方法は、当然のことながら、この作業がされていないことを提供し、バックと呼ばれますキャンセル。
長いコールバックタスクによってキャンセルされまし引き起こす可能性がいくつかの状況があります。
500ミリ秒以内に新しい指が押されました。
500msのがトリガ内でonScroll
、指定された距離にわたって、すなわち指の動き。
500ミリ秒以内に指を持ち上げます。
500ミリ秒以内に受信されたACTION_CANCEL
(イベントACTION
一般親コンテナ個人作成から誘導されます);
見てみましょうonFling
:
5、onFling
我々は通常、慣性スクロールを扱うことが最初の圧延ロール実行するために指定された最低速度よりも高速の大きなスライド式の前にコールバックするかどうかを判断する、またはしないことを除いて、違いはありません。
さて、最後に私たちが見てonSingleTapConfirmed
、onDoubleTap
、onDoubleTapEvent
それぞれをどのように扱うかです。
onSingleTapConfirmed、onDoubleTap、onDoubleTapEvent
private class GestureHandler extends Handler {
......
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
......
case TAP:
if (mDoubleTapListener != null) {
if (!mStillDown) {
mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);
} else {
mDeferConfirmSingleTap = true;
}
}
break;
......
}
}
}
public boolean onTouchEvent(MotionEvent ev) {
......
boolean handled = false;
switch (action & MotionEvent.ACTION_MASK) {
......
case MotionEvent.ACTION_DOWN:
......
if (isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) {
mIsDoubleTapping = true;
handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent);
handled |= mDoubleTapListener.onDoubleTapEvent(ev);
} else {
mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
}
mStillDown = true;
......
break;
case MotionEvent.ACTION_MOVE:
if (mIsDoubleTapping) {
handled |= mDoubleTapListener.onDoubleTapEvent(ev);
}
......
break;
case MotionEvent.ACTION_UP:
mStillDown = false;
if (mIsDoubleTapping) {
handled |= mDoubleTapListener.onDoubleTapEvent(ev);
}
......
if (mIsDoubleTapping) {
......
} else if (mInLongPress) {
......
} else if (mAlwaysInTapRegion) {
handled = mListener.onSingleTapUp(ev);
if (mDeferConfirmSingleTap && mDoubleTapListener != null) {
mDoubleTapListener.onSingleTapConfirmed(ev);
}
}
......
break;
......
}
......
return handled;
}
初めて目onSingleTapConfirmed
の方法は、それはすなわち、2つの場所に呼ばれています:
GestureHandler
受信TAP
メッセージを
処理ACTION_UP
イベント
場合GestureHandler
受信TAP
それは指が(持ち上げられたか否かをチェックメッセージ!mStillDown
既に持ち上げられた場合、それはすぐに呼ばれるであろう)、そうでなければmDeferConfirmSingleTap
マークがtrue
示すためonSingleTapConfirmed
べきメソッドACTION_UP
のコールバックを、プロセスに見ることができるACTION_UP
、指は、IF移動していないと、トリガーを押していなかった、それが決定するであろうmDeferConfirmSingleTap
かどうかtrue
はい、それはコールバックしまう、onSingleTapConfirmed
方法を。
見て、次にACTION_DOWN
、それが呼び出すisConsideredDoubleTap
インシデントをダブルクリックすることによって同定されたかどうかを決定する方法を、そうでない場合、することでGestureHandler
、メッセージの待ち時間(遅延コールバックの送信onSingleTapConfirmed
方式)
もしそうなら、しますmIsDoubleTapping
マークはtrue
、コールバックが続くonDoubleTap
とonDoubleTapEvent
。それはで見ることができるACTION_MOVE
とACTION_UP
もよるだろうmIsDoubleTapping
コールバックを続行するかどうかを決定するためonDoubleTapEvent
の方法を。
まあ、今それがどのように見るためにダブルクリックとして認識されているかどうか、見てisConsideredDoubleTap
の方法を:
まず、裁判官はmAlwaysInBiggerTapRegion
それがある場合、false
は、他のアクションの代表は(ACTION_MOVE
、)ACTION_CANCEL
それが直接返され、ダブルクリックイベントを検出中断false
(すなわち、ダブルクリックして特定されていません)。
第一及び第二のプレスプレス時間間隔を決定未満40ミリ秒(速すぎて)無視される場合は300ミリ秒以上は、タイムアウトしている場合はその後、それがアサートされています。
最後に、多くの学生は、一目見ただけで、ロジックの種類、数回よく見表示されないことがあり、あなたは、これは実際には、コンピューティングプレスでは初めてであることを知っているだろうとホールド第2のダウン距離を座標、2を使用して計算されます式の点との間の距離(√(X1 - X2)²+(Y1 - Y2)²)。
この時点で、いくつかの学生が尋ねるかもしれません。
でも平方それを開くしませんか?これは、コードはそれではない方法ですか?
実際には、ことをslopSquare
初期化中に(つまり、ダブルクリックが最大間隔として同定することができる)、それは、最大二乗されたので、広場を開く必要はありません。
emmm、その後、isConsideredDoubleTap
メソッドの最後の文の手段という、二回指定された間隔内でタッチイベントの座標かどうかを最大間隔の範囲であり、もしそうなら、それはダブルクリックであるということです。
:最後に、私のAndroidのコア技術の学習シラバスを添付して、関連するコンテンツへのアクセスは、私のGitHubで再生するhttps://github.com/Meng997998/AndroidJX
あなたが学習に投資するあなたの時間を取る、それはあなたが、スキルを獲得し、収益を増加させる機会を持つことができることを意味します。
ここに私の共有へのAndroidのPDF Daquanのは、学ぶ、学ぶために、このAndroidのPDF Daquanのは、本当にすべての側面を含んで学び、基本的なJavaの知識、アンドロイド、Androidの高度な拡張の基礎、およびそのコレクションアルゴリズム上が含まれています
アンドロイド関連の学習コンテンツ:私は見懸念個人的導入、または直接民間の手紙 I
マイコレクション本研究では、効果的にあなたが知識ポイントを把握するのに役立つことができます。
要するに、私たちは、高度な学習強化ここで助けにもありますが、またあなたは、オンライン検索データを学習する時間を節約するにも一緒に勉強親しい友人と共有することができます