2015-12-07 42 views
8

我有一个滚动视图水平多个relativelayout视图...一个数据库中的每个记录...是以编程方式创建的。确定多个视图中的哪个视图具有手势(双击,向左滑动,向右滑动等)?

我需要确定哪些观点得到了一些手势...点击,双击,和左/右轻扫影响。

当然的Click我能得到具有:

 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听者)':该构造在API级别3.使用弃用'GestureDetector(android.content.Context,android.view.GestureDetector.OnGestureListener)'代替(HTTPS://显影剂。 android.com/reference/android/view/GestureDetector.html#GestureDetector(android.view.GestureDetector.OnGestureListener)) – Suragch

+0

测试这对多个视图,'onLongPress'被烧成每一个事件(暂停后)。与[此问题]相同(https://stackoverflow.com/q/24326530/3681880)。我需要重写'onDraw'并返回'true'来使一切正常。 – Suragch