Android
Tocca Eventi
Ricerca…
Come variare tra gli eventi di tocco del gruppo di visualizzazione figlio e padre
- Il
onTouchEvents()
per i gruppi di viste nidificate può essere gestito dalboolean
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.
- 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.
Per gentile concessione da qui
- 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);
}