1. ホーム
  2. android

[解決済み] グリッドレイアウトにおけるフリングジェスチャーの検出

2022-03-18 02:52:23

質問

を取得したい。 fling ジェスチャー検出をAndroidアプリケーションで動作させる。

私が持っているのは GridLayout を含む9つの ImageView s. ソースはこちらでご覧いただけます。 ロマンガイのグリッドレイアウト .

私が取っているそのファイルは、ロマンガイの フォトストリームアプリケーション で、若干の脚色を施しただけです。

単純にクリックするだけの場合は onClickListener に対して、それぞれの ImageView メインとなるように追加します。 activity を実装しています。 View.OnClickListener . を認識するものを実装するのは、限りなく複雑に思えます。 fling . をまたぐ可能性があるからだと推測されます。 views ?

  • もし私のアクティビティが OnGestureListener どうすれば のジェスチャーリスナーとして設定します。 その Grid または Image ビューを作成します。 を追加します。

    public class SelectFilterActivity extends Activity implements
       View.OnClickListener, OnGestureListener { ...
    
    
  • もし私のアクティビティが OnTouchListener がない場合は onFling メソッドから override (これは 2つのイベントをパラメータとして を判断することができます。 を使用します)。

    public class SelectFilterActivity extends Activity implements
        View.OnClickListener, OnTouchListener { ...
    
    
  • をカスタムで作ると View のように GestureImageView を拡張することで ImageView をアクティビティに伝える方法がわかりません。 fling がビューから発生しました。いずれにせよ、これを試してみたところ、画面をタッチしてもメソッドは呼び出されませんでした。

私は、これがビューを越えて機能する具体的な例が必要なのです。何を、いつ、どのように添付すればよいのでしょうか? listener ? シングルクリックを検出できるようにする必要があります。

// Gesture detection
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        int dx = (int) (e2.getX() - e1.getX());
        // don't accept the fling if it's too short
        // as it may conflict with a button push
        if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.absvelocityY)) {
            if (velocityX > 0) {
                moveRight();
            } else {
                moveLeft();
            }
            return true;
        } else {
            return false;
        }
    }
});

画面の上に透明なビューを敷いて、フライングをキャプチャすることは可能でしょうか?

を選択しない場合 inflate 子画像のビューを XML から作成します。 GestureDetector の新しいサブクラスのコンストラクタ・パラメータとして使用します。 ImageView を作成するのですか?

これは、非常にシンプルなアクティビティで、その中に fling を検出することができます。 SelectFilterActivity(フォトストリームより引用) .

こんなソースがあったんだ

今までのところ、何もうまくいかなかったので、何かヒントがあればと思いました。

どのように解決するのですか?

ありがとうございます。 コードショウグン そのコードを私の状況に適応させました。

アクティビティに OnClickListener を通常通り使用します。

public class SelectFilterActivity extends Activity implements OnClickListener {

  private static final int SWIPE_MIN_DISTANCE = 120;
  private static final int SWIPE_MAX_OFF_PATH = 250;
  private static final int SWIPE_THRESHOLD_VELOCITY = 200;
  private GestureDetector gestureDetector;
  View.OnTouchListener gestureListener;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /* ... */

    // Gesture detection
    gestureDetector = new GestureDetector(this, new MyGestureDetector());
    gestureListener = new View.OnTouchListener() {
      public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
      }
    };

  }

  class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
      try {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
          return false;
        // right to left swipe
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
          Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
        } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
          Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
        }
      } catch (Exception e) {
         // nothing
      }
      return false;
    }

    @Override
    public boolean onDown(MotionEvent e) {
      return true;
    }
  }
}

メインレイアウトに追加したすべてのビューに、ジェスチャーリスナーをアタッチします。

// Do this for each view added to the grid
imageView.setOnClickListener(SelectFilterActivity.this); 
imageView.setOnTouchListener(gestureListener);

オーバーライドされたメソッドがヒットするのを、畏敬の念を持って見てください。 onClick(View v) のアクティビティと onFling のジェスチャー・リスナーの

public void onClick(View v) {
  Filter f = (Filter) v.getTag();
  FilterFullscreenActivity.show(this, input, f);
}

ポスト「フライング」ダンスはオプションだが、推奨される。