2015-12-07 20 views
8

私は、複数のrelativelayoutビューを水平に表示するスクロールビューを持っています...データベース内のレコードごとに1つずつ、プログラマチックに作成されます。ジェスチャーを複数のビューに持つVIEW(ダブルクリック、左スワイプ、右スワイプなど)を決定しますか?

いくつかのジェスチャー(クリック、ダブルクリック、左右スワイプ)の影響を受けるビューを特定する必要があります。もちろん

私は得ることができましたクリックします。

 RelativeLayout rlView = new RelativeLayout(this); 
    rlView.setId(10000+myrecordid); 
    rlView.setOnClickListener(myviewclick); 

とmyviewclick:

private View.OnClickListener myviewclick = new View.OnClickListener() { 
    public void onClick(View v) { 
     Integer i=v.getId()-10000; 
     // Do some processing on this view 
    } 
}; 

私はオンライン見つけたものから、私はジェスチャーをこの方法を取得しようとしました:

rlView.setOnTouchListener(myviewtouch); 

このコードでは、

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){ 
    public boolean onTouch(View v, MotionEvent event) { 
     return gestureDetector.onTouchEvent(event); 
    } 

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Log.i("MYLOG","double tap"); 
      return true; 
     } 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Log.i("MYLOG","SingleTapConfirmed"); 
      return true; 
     } 
     @Override 
     public void onLongPress(MotionEvent e) { 
      Log.i("MYLOG","LongPress"); 
     } 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      if (e1.getX()<e2.getX()) 
       Log.i("MYLOG","Fling Right"); 
      else 
       Log.i("MYLOG","Fling Left"); 
      return true; 
     } 
    }); 
}; 

MYLOGによると、私は必要に応じて適切なジェスチャーを取得しています。問題は、ジェスチャーが入っているビューIDを取得する方法がわかりません。onTouchにあることがわかりますが、動きを判断するためにgestureDetector.OnTouchEventと呼ばれています。この時点では失われています。

私はStackOverflowや他のサイトを数時間にわたって検索しました...ジェスチャーをどのように判断するのかについての違いを示していますが、私が使用できる複数のビューで何かを見つけるのに問題があります。

ご協力いただければ幸いです。

+0

私はなぜ[この質問](訳:https://stackoverflow.com/questions/45070129/detecting-common-gestures-on-multiple-views-in-android)に賞金を追加しているのかを説明します。 – Suragch

答えて

5

私はそれを理解したと思います。おそらくこれを行う最もエレガントな方法ではないでしょうし、このように扱うために他の "問題"があるかもしれませんが、今のところそれが機能します。しかし、他の人がこの問題を発見した場合は、ここで私はそれを回避する方法です:

私の変更されたコードがどのように働いたのですか?私は今、これまで「ビュー」のジェスチャがであることを起こっていることが必要である各ジェスチャイベント内のビューを参照することができる内部のパブリック変数vTouchを使用することにより

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){ 
    public View vTouch; 
    public boolean onTouch(View v, MotionEvent event) { 
     vTouch=v; 
     return gestureDetector.onTouchEvent(event); 
    } 

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","double tap in view: "+viewId); 
      return true; 
     } 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","SingleTapConfirmed in view: "+viewId); 
      return true; 
     } 
     @Override 
     public void onLongPress(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","LongPress in view: "+viewId); 
     } 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      Integer viewId=vTouch.getId(); 
      if (e1.getX()<e2.getX()) 
       Log.i("MYLOG","Fling Right in view: "+viewId); 
      else 
       Log.i("MYLOG","Fling Left in view: "+viewId); 
      return true; 
     } 
    }); 
}; 

:私は vTouchと呼ばれるパブリック変数を追加しました。
+0

ありがとう。 Androidでスワイプを検出することはこれでは難しいかもしれないと信じるのは難しいです! – Fattie

+0

['GestureDetector(GestureDetector.OnGestureListener listener)':このコンストラクタはAPIレベル3では非推奨です。代わりに 'GestureDetector(android.content.Context、android.view.GestureDetector.OnGestureListener)'を使用してください。](https:// developer。 android.com/reference/android/view/GestureDetector.html#GestureDetector(android.view.GestureDetector.OnGestureListener)) – Suragch

+0

これを複数のビューでテストすると、すべてのイベント(一時停止後)で 'onLongPress'が発生していました。 [この質問](https://stackoverflow.com/q/24326530/3681880)と同じです。すべてを動作させるには 'onDraw'をオーバーライドして' true'を返す必要がありました。 – Suragch

関連する問題