Sök…


Hur man varierar mellan beröringsevenemang för barn och föräldrar

  1. onTouchEvents() för kapslade visningsgrupper kan hanteras av den boolean onInterceptTouchEvent .

Standardvärdet för OnInterceptTouchEvent är falskt.

Förälderns onTouchEvent emot före barnets. Om OnInterceptTouchEvent returnerar falskt skickar den rörelsehändelsen ner kedjan till barnets OnTouchEvent hanterare. Om det går sant kommer föräldern att hantera beröringshändelsen.

Det kan emellertid förekomma fall när vi vill att vissa OnTouchEvent ska hantera OnTouchEvent s och vissa ska hanteras av föräldersvyn (eller eventuellt förälder till föräldern).

Detta kan hanteras på mer än ett sätt.

  1. Ett sätt att ett barnelement kan skyddas från förälderns OnInterceptTouchEvent är genom att implementera requestDisallowInterceptTouchEvent .

offentligt ogiltigt begäranDisallowInterceptTouchEvent (boolean disallowIntercept)

Detta förhindrar att någon av överordnade vyer hanterar OnTouchEvent för detta element, om elementet har aktiverat händelseshanterare.

Om OnInterceptTouchEvent är felaktigt kommer OnTouchEvent att utvärderas. Om du har en metod inom barnelementen som hanterar de olika berörningshändelserna kommer alla relaterade händelseshanterare som är inaktiverade att returnera OnTouchEvent till överordnade.

Detta svar:
En visualisering av hur utbredningen av berörningshändelser passerar genom:
parent -> child|parent -> child|parent -> child views.

ange bildbeskrivning här Med tillstånd härifrån

  1. Ett annat sätt är att returnera olika värden från OnInterceptTouchEvent för överordnade.

Detta exempel taget från Hantera Touch-händelser i en ViewGroup och visar hur man fångar upp barnets OnTouchEvent när användaren rullar.

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

Det här är en kod från samma länk som visar hur du skapar parametrarna för rektangeln runt ditt element:

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow