Zoeken…


Hoe te variëren tussen groepsaanraakgebeurtenissen voor kinderen en ouders

  1. De onTouchEvents() voor geneste weergavegroepen kunnen worden beheerd door de boolean onInterceptTouchEvent .

De standaardwaarde voor OnInterceptTouchEvent is false.

De onTouchEvent de onTouchEvent wordt vóór het kind ontvangen. Als de OnInterceptTouchEvent false retourneert, verzendt deze de gebeurtenis motion langs de keten naar de OnTouchEvent handler van het kind. Als het waar terugkeert, zal de ouder de aanraakgebeurtenis afhandelen.

Er kunnen echter gevallen zijn waarin we willen dat sommige onderliggende elementen OnTouchEvent s beheren en sommige worden beheerd door de bovenliggende weergave (of mogelijk de bovenliggende van de bovenliggende).

Dit kan op meerdere manieren worden beheerd.

  1. Een manier waarop een child-element kan worden beschermd tegen de OnInterceptTouchEvent van de ouder, is door de requestDisallowInterceptTouchEvent te implementeren.

public void requestDisallowInterceptTouchEvent (boolean disallowIntercept)

Dit voorkomt dat een van de bovenliggende weergaven het OnTouchEvent voor dit element beheert, als voor het element event-handlers zijn ingeschakeld.

Als de OnInterceptTouchEvent vals is, het kind element OnTouchEvent zal worden geëvalueerd. Als er binnen de onderliggende elementen een methode is die de verschillende aanraakgebeurtenissen afhandelt, zullen alle gerelateerde event-handlers die zijn uitgeschakeld het OnTouchEvent teruggeven aan de ouder.

Dit antwoord:
Een visualisatie van hoe de verspreiding van aanraakgebeurtenissen verloopt:
parent -> child|parent -> child|parent -> child views.

voer hier de afbeeldingsbeschrijving in Hoffelijkheid van hier

  1. Een andere manier is het retourneren van variërende waarden uit de OnInterceptTouchEvent voor de ouder.

Dit voorbeeld is afkomstig van het beheren van aanraakgebeurtenissen in een ViewGroup en laat zien hoe het OnTouchEvent het kind kan worden OnTouchEvent wanneer de gebruiker aan het scrollen is.

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

Dit is een code van dezelfde link die laat zien hoe u de parameters van de rechthoek rond uw element kunt maken:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow