プログラマーの意志「コピー」の歴史!このガードスキル、自身の目的のためにシステムのソースコードが得意!

著者:陳ヤン哲エッジ&

それは私に尋ねた同僚から発信:「どのようにエレガントなリスナーをダブルクリックし、」この行動を?

時には完全にシステムにいくつかの問題を持っている能力、我々は簡単に望んでいた機能を実現する可能性があるため、実際には、多くの同様のイベントに関連する、我々は、システムのソースコードを参照することができます。

上記の例の同僚は尋ねました:

どのようにエレガントなリスナーをダブルクリックしますか?

しかし私は、システムがで私たちを提供している、私たちは多かれ少なかれいくつかの実装を持っていると信じていGestureDetectorたコードの承認が改善されます、あなたは、このような実現に精通している場合、システムは同じプログラムのために選択することができます、クラス。

だから、今日、私たちは下学ぶ機会を持っています:

GestureDetectorどのようにサポートジェスチャーについて検出されましたか?

ここでは、小さなエッジコンテンツ分析があります。

私たちは、クラスのインスタンスを作成し、インターフェイスに必要OnGestureListenerとコンストラクタに渡されたパラメータとしてそれを実装(ジェスチャーの様々なを監視するために使用):

各コールバックメソッド(理解することは非常に簡単)のタイミングを説明します:

  • onDown:フィンガープレス;

  • onShowPress:指が押された後、100ミリ秒以内に発生しません、移動されません。

  • onSingleTapUp:押して、指が移動されていない、とリフトは500ミリ秒以内(クリックすると識別することができます)。

  • onScroll:指をドラッグします。

  • onLongPress:長押し(プレス指、移動していない500ミリ秒、以内に発生しません)。

  • onFling:すぐに(慣性スクロールを)手放す指をドラッグした後、

またOnGestureListener、あるOnDoubleTapListener監視するために使用される名前を推測することができ参照イベントをダブルクリックします。

説明:

  • onSingleTapConfirmed:私は、これがクリックイベントであることを確認した(すなわち:リフト指の後に、300ミリ秒の指が再び押され待ちませんでした)ダブルクリックで素早くダブルタップする画面を継続しなければならないトリガします。

  • onDoubleTap:ダブルクリックし、トリガ・イベント(指を持ち上げた後、300ミリ秒(注以内に再度押す:もう一度押すとそれがトリガされ、それがトリガーの前に提起されなかったので))

  • onDoubleTapEvent:含めてダブルクリックし、後のトリガー指のタッチイベントACTION_DOWNACTION_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値をに基づいて取得する方法と、開口外観:ViewConfigurationgetTapTimeout

遅延は、このタスクが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コールバックの条件が必要であるmInLongPressfalse(すなわち長押しがトリガされません))

その後、コールバックonLongPressメソッドを。

だから、LONG_PRESSときにそれを送信するメッセージは?

また、時ACTION_DOWNの時間:

メッセージを送信する前に、第1のモニタがプレスイベントになっているかどうかを確認だけでなく、プレス補正を発行し、取り消し後のタスクを実行しなかっただろう。

与えられた時間、あなたはイベント時間プラスダウン見ることができgetLongPressTimeout、指が半分秒押しすると、ある長さのメソッドが返すデフォルトは500(ミリ秒)であるが、onLongPressこの方法は、当然のことながら、この作業がされていないことを提供し、バックと呼ばれますキャンセル。

長いコールバックタスクによってキャンセルされまし引き起こす可能性がいくつかの状況があります。

500ミリ秒以内に新しい指が押されました。

500msのがトリガ内でonScroll、指定された距離にわたって、すなわち指の動き。

500ミリ秒以内に指を持ち上げます。

500ミリ秒以内に受信されたACTION_CANCEL(イベントACTION一般親コンテナ個人作成から誘導されます);

見てみましょうonFling

5、onFling

我々は通常、慣性スクロールを扱うことが最初の圧延ロール実行するために指定された最低速度よりも高速の大きなスライド式の前にコールバックするかどうかを判断する、またはしないことを除いて、違いはありません。

さて、最後に私たちが見てonSingleTapConfirmedonDoubleTaponDoubleTapEventそれぞれをどのように扱うかです。

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、コールバックが続くonDoubleTaponDoubleTapEventそれはで見ることができるACTION_MOVEACTION_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

マイコレクション本研究では、効果的にあなたが知識ポイントを把握するのに役立つことができます。

要するに、私たちは、高度な学習強化ここで助けにもありますが、またあなたは、オンライン検索データを学習する時間を節約するにも一緒に勉強親しい友人と共有することができます

公開された168元の記事 ウォン称賛71 ビュー20000 +

おすすめ

転載: blog.csdn.net/Aerfa789/article/details/105203310