2016-04-27 9 views
0

Ich verstehe Views können entscheiden, MotionEvent selbst zu behandeln, indem Sie in onTouchEvent True zurückgeben, wenn ein ACTION_DOWN Ereignis übergeben wird. Wenn sie true zurückgeben, erhalten sie alle folgenden MOVE/UP/CANCEL Ereignisse. Das funktioniert gut.Konkurrierende onTouchEvent-Handler?

Was ich tun möchte, ist diese Entscheidung auf das Ereignis ACTION_MOVE zu verschieben. Ich habe ein Kind ein Viewgroup enthält, und je nachdem, ob horizontal oder vertikal scrollen, ich möchte das Viewgroup oder Kind zur Handhabung des MotionEvents

So etwas verantwortlich sein:

public class MyViewGroup extends ViewGroup{ 
    public boolean onTouchEvent(MotionEvent event) { 
     int action = event.getActionMasked(); 
     if (action == MotionEvent.ACTION_DOWN) { 
      mDownX = event.getX(); 
     } else if (action == MotionEvent.ACTION_MOVE) { 
      if (Math.abs(event.getX() - mDownX) > THRESHOLD_X) { 
       // I want all the future events to be forwarded to this ViewGroup 
       return true; 
      } 
     } 
     return false; 
    } 
} 

public class MyChild extend View { 
    public boolean onTouchEvent(MotionEvent event) { 
     int action = event.getActionMasked(); 
     if (action == MotionEvent.ACTION_DOWN) { 
      mDownY = event.getY(); 
     } else if (action == MotionEvent.ACTION_MOVE) { 
      if (Math.abs(event.getY() - mDownY) > THRESHOLD_Y) { 
       // I want all the future events to be forwarded to this View 
       return true; 
      } 
     } 
     return false; 
    } 
} 

Ist das möglich? Momentan erhält nur die ViewGroup die MOVE/UP/CANCEL. Ich schätze, weil es kein geeignetes Kind gefunden hat, um die Ansichten weiterzuleiten.

Antwort

0

Für das Protokoll, ich endete dies durch Überschreiben ViewGroup.dispatchTouchEvent(). Es ist ein bisschen umständlich, aber machbar. Ich kann den Code bei Bedarf teilen.