2015-02-10 17 views
5

Ho creato un componente personalizzato con un onTouchListener e un rilevatore di gesti, Inserisco il componente personalizzato nel file xml di MainActivity che ha anche sia onTouchEvent che un rilevatore di gesti. Voglio rilevare singoli tocchi sul componente personalizzato e premere a lungo su MainActivity, ma in qualche modo sembra che gli ascoltatori del tocco interagiscano e che i singoli tocchi non vengano mai rilevati.onSingleTapUp di SimpleOnGestureListener mai chiamato

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

aggiungere Log.d nel metodo onTouch e vedere gli eventi – pskink

+0

che ho fatto, se mi toccare il componente personalizzato, gli eventi generati in ordine sono: onDown a CustomView. Giava; Action_Down su CustomView.java; onDown su MainActivity.java; Action_Down su MainActivity.java; ma non onSingleTapUp – daxter1992

+0

e ora leggere la documentazione su ciò che omTouch ritorna – pskink

risposta

12

Se avete intenzione di rispondere a un rubinetto up è inoltre necessario per tornare vero dal onDown, l'impostazione predefinita sarà return false (Sto indovinando qui).

Almeno per quanto mi riguarda, non ho ricevuto onSingleTapUp chiamato per il mio codice finché non mi sono assicurato che onDown restituito vero.

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

Ho visto altri framework in cui 'up' eventi vengono consegnati solo se si accettano eventi 'giù', così ho pensato che era quello che stava accadendo qui.

3

non c'è bisogno di indovinare (@alexndr) !!! un'occhiata a fonti

se u estende chiamata GestureDetector.SimpleOnGestureListener a super.onDown (evento)

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

restituirà falso, ma se u attuare gesto rivelatore ascoltatore allora non c'è super!

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. regola è semplice:

se l'evento è consumato return true se non return false

0

Hai solo bisogno di ritorno vero nella tua onTouchEvent(MotionEvent event).

Un po 'come questo:

@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; 
} 
Problemi correlati