2015-02-10 16 views
5

Tôi đã tạo một thành phần tùy chỉnh với cả onTouchListener và bộ dò cử chỉ, Tôi đặt thành phần tùy chỉnh trong tệp xml của MainActivity cũng có cả onTouchEvent và bộ dò tìm cử chỉ. Tôi muốn phát hiện các vòi duy nhất trên thành phần tùy chỉnh và nhấn lâu trên MainActivity, nhưng có vẻ như bằng cách nào đó các trình nghe cảm ứng tương tác và các vòi duy nhất không bao giờ bị phát hiện.OnSingleTapUp của SimpleOnGestureListener không bao giờ được gọi là

MainActivity.java:

public class MainActivity extends ActionBarActivity { 
private GestureDetector detector; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    detector = new GestureDetector(this, new LongPressDetector()); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    detector.onTouchEvent(event); 
    int action = event.getActionMasked(); 
    switch (action){ 
     case MotionEvent.ACTION_DOWN:{ 
      Log.d("TouchEvent", "Action_Down at MainActivity.java"); 
      break; 
     } 
    } 
    return super.onTouchEvent(event); 
} 

private class LongPressDetector extends GestureDetector.SimpleOnGestureListener{ 
    @Override 
    public boolean onDown(MotionEvent e) { 
     Log.d("TouchEvent", "onDown at MainActivity.java"); 
     return super.onDown(e); 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     Log.d("TouchEvent", "onLongPress at MainActivity.java"); 
     super.onLongPress(e); 
    } 
} 
} 

CustomView.java:

public class CustomView extends RelativeLayout { 
private GestureDetector detector; 

public CustomView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

private void init(Context c){ 
    LayoutInflater layoutInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    layoutInflater.inflate(R.layout.customview, this); 
    detector = new GestureDetector(c, new TapDetector()); 
    this.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      detector.onTouchEvent(event); 
      int action = event.getActionMasked(); 
      switch (action){ 
       case MotionEvent.ACTION_DOWN:{ 
        Log.d("TouchEvent", "Action_Down at CustomView.java"); 
        break; 
       } 
      } 
      return false; 
     } 
    }); 
} 

private class TapDetector extends GestureDetector.SimpleOnGestureListener{ 
    @Override 
    public boolean onDown(MotionEvent e) { 
     Log.d("TouchEvent", "onDown at CustomView.java"); 
     return super.onDown(e); 
    } 
    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     Log.d("TouchEvent", "onSingleTapUp at CustomView.java"); 
     return super.onSingleTapUp(e); 
    } 
} 
} 
+0

thêm Log.d trong phương pháp onTouch của bạn và xem những sự kiện – pskink

+0

tôi đã làm, nếu tôi gõ vào phần tùy chỉnh, các sự kiện bắn theo thứ tự là: onDown tại CustomView. java; Action_Down tại CustomView.java; onDown tại MainActivity.java; Action_Down tại MainActivity.java; nhưng không có onSingleTapUp – daxter1992

+0

và bây giờ đọc tài liệu về những gì omTouch trả về – pskink

Trả lời

12

Nếu bạn đang đi để đáp ứng với một vòi nước lên bạn cũng cần phải trở thành sự thật từ onDown, mặc định sẽ trả về false (Tôi đoán ở đây).

Ít nhất với tôi, tôi không nhận được onSingleTapUp được gọi cho mã của tôi cho đến khi tôi đảm bảo rằng onDown trả về true.

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

Tôi đã thấy các khung khác khi sự kiện 'lên' chỉ được gửi nếu sự kiện 'xuống' được chấp nhận, vì vậy tôi cho rằng đó là những gì đã xảy ra ở đây.

3

không cần đoán (@alexndr) !!! nhìn vào nguồn

nếu u kéo dài cuộc gọi GestureDetector.SimpleOnGestureListener để super.onDown (sự kiện)

public boolean onDown(MotionEvent e) { 
     return false; 
    } 

sẽ trả về false nhưng nếu u thực hiện cử chỉ dò người nghe thì không có siêu!

public class GestureDetector { 
/** 
* The listener that is used to notify when gestures occur. 
* If you want to listen for all the different gestures then implement 
* this interface. If you only want to listen for a subset it might 
* be easier to extend {@link SimpleOnGestureListener}. 
*/ 
public interface OnGestureListener { 

    /** 
    * Notified when a tap occurs with the down {@link MotionEvent} 
    * that triggered it. This will be triggered immediately for 
    * every down event. All other events should be preceded by this. 
    * 
    * @param e The down motion event. 
    */ 
    boolean onDown(MotionEvent e); 

ps. quy tắc rất đơn giản:

nếu EVENT được tiêu thụ RETURN TRUE nếu không trở về FALSE

0

Bạn chỉ cần quay trở lại đúng trong onTouchEvent(MotionEvent event) của bạn.

Hơi như thế này:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    detector.onTouchEvent(event); 
    int action = event.getActionMasked(); 
    switch (action){ 
     case MotionEvent.ACTION_DOWN:{ 
      Log.d("TouchEvent", "Action_Down at MainActivity.java"); 
      break; 
     } 
    } 
    return true; 
} 
Các vấn đề liên quan