2015-12-07 16 views
8

Tôi có một chế độ xem cuộn với nhiều chế độ xem relativelayout theo chiều ngang ... một cho mỗi bản ghi trong cơ sở dữ liệu ... được tạo theo chương trình.Xác định VIEW nào trong nhiều lượt xem có cử chỉ (nhấp đúp, vuốt sang trái, vuốt sang phải, v.v ...)?

Tôi cần xác định chế độ xem nào bị ảnh hưởng bởi một số cử chỉ ... nhấp, nhấp đúp và vuốt sang trái/phải.

Tất nhiên CLICK tôi đã có thể nhận được với:

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

và myviewclick:

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

Từ những gì tôi tìm thấy trên mạng, tôi đã cố gắng để có được những cử chỉ theo cách này:

rlView.setOnTouchListener(myviewtouch); 

với mã này:

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; 
     } 
    }); 
}; 

Theo MYLOG, tôi nhận được các cử chỉ thích hợp khi cần. Vấn đề là, tôi không biết làm thế nào để có được ID quan điểm mà các cử chỉ được in Tôi biết nó là trong onTouch nhưng được gọi là gestureDetector.OnTouchEvent để xác định chuyển động ... và tôi bị mất vào thời điểm này.

Tôi đã tìm kiếm trên StackOverflow và các trang khác trong vài giờ ... tất cả đều thể hiện sự chênh lệch về cách xác định cử chỉ ... nhưng gặp khó khăn khi tìm kiếm bất kỳ điều gì về việc sử dụng nhiều chế độ xem.

Mọi trợ giúp sẽ được đánh giá cao.

+0

Tôi giải thích ngữ cảnh vì sao tôi thêm tiền thưởng vào [câu hỏi này] (https://stackoverflow.com/questions/45070129/detecting-common-gestures-on-multiple-views-in-android). – Suragch

Trả lời

5

Tôi nghĩ rằng tôi đã tìm ra. Có lẽ không phải là cách thanh lịch nhất để làm điều đó, và có thể có "vấn đề" khác vì xử lý nó theo cách này, nhưng bây giờ nó hoạt động. Nhưng nếu những người khác tìm thấy vấn đề này, dưới đây là cách tôi làm việc xung quanh nó:

Đây là cách mã được sửa đổi của tôi hoạt động. Tôi đã thêm một biến nào gọi 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; 
     } 
    }); 
}; 

Bằng việc sử dụng biến công nội vTouch bây giờ tôi có thể tham khảo quan điểm trong mỗi sự kiện cử chỉ nơi từng là "xem" là cần thiết rằng cử chỉ tình cờ có mặt trong

.
+0

cảm ơn vì điều đó. thật khó để tin rằng nó có thể là khó khăn để phát hiện một swipe trong Android! – Fattie

+0

['GestureDetector (GestureDetector.OnGestureListener listener)': Hàm khởi tạo này không được dùng ở cấp API 3. Sử dụng 'GestureDetector (android.content.Context, android.view.GestureDetector.OnGestureListener)' thay thế.] (Https: // developer. android.com/reference/android/view/GestureDetector.html#GestureDetector(android.view.GestureDetector.OnGestureListener)) – Suragch

+0

Thử nghiệm điều này trên nhiều chế độ xem, 'onLongPress' đã kích hoạt cho mọi sự kiện (sau khi tạm dừng). Tương tự như [câu hỏi này] (https://stackoverflow.com/q/24326530/3681880). Tôi cần ghi đè lên 'onDraw' và trả về' true' để làm mọi thứ hoạt động. – Suragch

Các vấn đề liên quan