最近のプロジェクトでは、ジェスチャーのスライドアップまたはクリックによるインターフェースの外へのスライドアウトの効果を実現する必要があり、その実装では GestureDetector を使用し、onFling で判断しますが、問題が発生しました。レイアウト全体ですが、別のペアのビュー セットがある場合、クリック監視が行われ、ビュー上でのスライド アップ ジェスチャは無効になります。
この View 自体をクリック専用に使用する場合は、残念ながらこの View のサイズは大きくないため、クリック領域を拡張する必要があります。
最初に考えられる方法は、RelativeLayout、LinearLayout などと同様に、ビューをコンテナーでラップすることですが、これによりレイアウトにレイヤーが 1 つ追加されます。
レイヤーを追加せずにクリック領域を拡大する方法を考えられますか?
GestureDetector は Android が提供するジェスチャ操作クラスで、シングル クリック、ダブル クリック、長押しなどの操作を提供し、これらのイベントを onTouch に渡すため、これを使用してクリック イベントをトリガーしたコントロールを判断できます。
しかし、私たちの問題はコントロールを識別することではなく、クリック領域を拡大することであるため、ユーザーのクリック操作がどの領域に該当するかを知る必要があります。
幸いなことに、MotionEvent はイベントの発生時に座標を提供するため、クリック時の座標を知ることができ、指定された領域内にあるかどうかをさらに判断できます。
MotionEvent は、Android のタッチコーディングにとって重要なクラスであり、画面上でユーザーのタッチ情報を提供します。 MotionEvent を通じてタッチ イベント タイプとタッチ座標を取得できますが、マルチタッチをサポートし、さらにタッチ インデックス情報も取得できるようになりました。
コードから始めましょう:
@Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN){ int downX = (int)event.getX(); int[] location = new int[2]; ivMore.getLocationInWindow(location); if(Math.abs(downX - location[0]) <= 50){ ... } } return gestureDetector.onTouchEvent(event); }
まず、MotionEvent の getAction を通じてタッチ イベント タイプを取得します。クリックのタイプは ACTION_DOWN で、次に MotionEvent の getX を通じてクリックの X 座標を取得し、次に指定された位置を取得します。 getLocationInWindow. View の座標。ここでは、コンポーネントの X 軸座標にプラスまたはマイナス 50 (左右の範囲を示す) をトリガー範囲として指定します。
レイアウトレベルを上げずにクリック範囲を拡大できるようになりました。
GestureDetector を使用してスライディング アップ判定を実現するのは非常に簡単で、OnGestureListener インターフェイスを実装し、対応するコールバックで指定した操作を実行するだけです。ただし、GestureDetector 自体はタッチ イベントをキャプチャしないため、onTouch イベントを実装して呼び出す必要があります。 GestureDetector onTouchEvent は、対応するイベントを渡します。
スライド操作は onFling コールバックで実行され、2 つの履歴 MotionEvent に渡されます。Y 軸座標が変更されたかどうかを判断するだけで済みます。
Android のタッチ コントロールは非常に大きなトピックであり、私たち自身のニーズを明確にすることを前提として、対応する迅速な解決策を見つけるだけで済みます。