Android Come variare tra gli eventi di tocco del gruppo di visualizzazione figlio e padre

Esempio

  1. Il onTouchEvents() per i gruppi di viste nidificate può essere gestito dal boolean onInterceptTouchEvent .

Il valore predefinito per OnInterceptTouchEvent è false.

onTouchEvent del genitore viene ricevuto prima del figlio. Se OnInterceptTouchEvent restituisce false, invia l'evento di movimento lungo la catena al gestore OnTouchEvent del bambino. Se restituisce true, i genitori gestiranno l'evento touch.

Tuttavia ci possono essere casi in cui vogliamo che alcuni elementi figlio gestiscano OnTouchEvent e alcuni siano gestiti dalla vista genitore (o possibilmente il genitore del genitore).

Questo può essere gestito in più di un modo.

  1. Un modo in cui un elemento figlio può essere protetto da OnInterceptTouchEvent del genitore è implementando requestDisallowInterceptTouchEvent .

public void requestDisallowInterceptTouchEvent (boolean disallowIntercept)

Ciò impedisce a qualsiasi delle viste principali di gestire OnTouchEvent per questo elemento, se l'elemento ha abilitati i gestori di eventi.

Se OnInterceptTouchEvent è falso, verrà valutato l'elemento OnTouchEvent dell'elemento OnTouchEvent . Se si dispone di metodi all'interno degli elementi figlio che gestiscono i vari eventi di tocco, qualsiasi gestore di eventi correlato disabilitato restituirà OnTouchEvent al genitore.

Questa risposta:
Una visualizzazione di come passa la propagazione degli eventi tattili:
parent -> child|parent -> child|parent -> child views.

inserisci la descrizione dell'immagine qui Per gentile concessione da qui

  1. Un altro modo restituisce valori diversi da OnInterceptTouchEvent per il genitore.

Questo esempio è tratto da Gestione degli eventi di tocco in un ViewGroup e dimostra come intercettare l' OnTouchEvent del bambino quando l'utente sta scorrendo.

4a.

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    /*
     * This method JUST determines whether we want to intercept the motion.
     * If we return true, onTouchEvent will be called and we do the actual
     * scrolling there.
     */


    final int action = MotionEventCompat.getActionMasked(ev);

    // Always handle the case of the touch gesture being complete.
    if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
        // Release the scroll.
        mIsScrolling = false;
        return false; // Do not intercept touch event, let the child handle it
    }

    switch (action) {
        case MotionEvent.ACTION_MOVE: {
            if (mIsScrolling) {
                // We're currently scrolling, so yes, intercept the 
                // touch event!
                return true;
            }

            // If the user has dragged her finger horizontally more than 
            // the touch slop, start the scroll

            // left as an exercise for the reader
            final int xDiff = calculateDistanceX(ev); 

            // Touch slop should be calculated using ViewConfiguration 
            // constants.
            if (xDiff > mTouchSlop) { 
                // Start scrolling!
                mIsScrolling = true;
                return true;
            }
            break;
        }
        ...
    }

    // In general, we don't want to intercept touch events. They should be 
    // handled by the child view.
    return false;
}

Questo è un codice dallo stesso link che mostra come creare i parametri del rettangolo attorno al tuo elemento:

4b.

// The hit rectangle for the ImageButton
myButton.getHitRect(delegateArea);
        
// Extend the touch area of the ImageButton beyond its bounds
// on the right and bottom.
delegateArea.right += 100;
delegateArea.bottom += 100;
        
// Instantiate a TouchDelegate.
// "delegateArea" is the bounds in local coordinates of 
// the containing view to be mapped to the delegate view.
// "myButton" is the child view that should receive motion
// events.
TouchDelegate touchDelegate = new TouchDelegate(delegateArea, myButton);
 
// Sets the TouchDelegate on the parent view, such that touches 
// within the touch delegate bounds are routed to the child.
if (View.class.isInstance(myButton.getParent())) {
    ((View) myButton.getParent()).setTouchDelegate(touchDelegate);
}