Suche…


Wie unterscheidet man zwischen untergeordneten und übergeordneten Ansichtsgruppenereignissen?

  1. onTouchEvents() für verschachtelte Ansichtsgruppen kann mit dem boolean onInterceptTouchEvent verwaltet werden .

Der Standardwert für OnInterceptTouchEvent ist false.

Das onTouchEvent des übergeordneten onTouchEvent wird vor dem des Kindes empfangen. Wenn OnInterceptTouchEvent den OnInterceptTouchEvent false zurückgibt, sendet es das Bewegungsereignis entlang der Kette an den OnTouchEvent Handler des OnTouchEvent . Wenn der Wert true zurückgegeben wird, behandelt das übergeordnete Element das Berührungsereignis.

Es kann jedoch Fälle geben, in denen wir möchten, dass einige OnTouchEvent Elemente OnTouchEvent verwalten und andere von der übergeordneten Ansicht (oder möglicherweise dem übergeordneten Element des OnTouchEvent ) verwaltet werden.

Dies kann auf mehrere Arten verwaltet werden.

  1. Ein OnInterceptTouchEvent Element kann vor dem OnInterceptTouchEvent des übergeordneten OnInterceptTouchEvent geschützt werden, indem das requestDisallowInterceptTouchEvent implementiert wird .

public void requestDisallowInterceptTouchEvent (boolean disallowIntercept)

Dadurch wird verhindert, dass eine der übergeordneten Ansichten das OnTouchEvent für dieses Element verwaltet, wenn für das Element Ereignisprozeduren aktiviert sind.

Wenn OnInterceptTouchEvent den OnInterceptTouchEvent false hat, wird das OnTouchEvent des OnTouchEvent Elements ausgewertet. Wenn in den untergeordneten Elementen Methoden vorhanden sind, die die verschiedenen Berührungsereignisse verarbeiten, geben alle zugehörigen deaktivierten Ereignishandler das OnTouchEvent an das übergeordnete Element zurück.

Diese Antwort:
Eine Visualisierung, wie die Ausbreitung von Berührungsereignissen durchläuft:
parent -> child|parent -> child|parent -> child views.

Geben Sie hier die Bildbeschreibung ein Höflichkeit von hier

  1. Eine andere Möglichkeit ist, unterschiedliche Werte aus dem OnInterceptTouchEvent für das übergeordnete OnInterceptTouchEvent .

In diesem Beispiel aus dem Verwalten von Touch-Ereignissen in einer ViewGroup wird veranschaulicht , wie das OnTouchEvent des Kindes OnTouchEvent wenn der Benutzer einen Bildlauf durchführt.

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

Dies ist ein Code aus demselben Link, der zeigt, wie Sie die Parameter des Rechtecks ​​um Ihr Element erstellen:

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow