I decided to post this question and answer in response to this comment to this question:
How to handle click in the child Views, and touch in the parent ViewGroups?
I will paste the comment here:
Suppose I want to override the touch events only for handling some of the children, what can I do inside this function to have it working ? I mean, for some children it would work as usual, and for some, the parent-view will decide if they will get the touch events or not.
So the question is this: How do I prevent the parent onTouchEvent() from overriding some child elements' onTouchEvent(), while having it override those of other children?
onTouchEvents()for nested view groups can be managed by thebooleanonInterceptTouchEvent.The default value for the
OnInterceptTouchEventis false.The parent's
onTouchEventis received before the child's. If theOnInterceptTouchEventreturns false, it sends the motion event down the chain to the child'sOnTouchEventhandler. If it returns true the parent's will handle the touch event.However there may be instances when we want some child elements to manage
OnTouchEvents and some to be managed by the parent view (or possibly the parent of the parent).This can be managed in more than one way.
OnInterceptTouchEventis by implementing the requestDisallowInterceptTouchEvent.This prevents any of the parent views from managing the
OnTouchEventfor this element, if the element has event handlers enabled.OnInterceptTouchEventis false, the child element'sOnTouchEventwill be evaluated. If you have a methods within the child elements handling the various touch events, any related event handlers that are disabled will return the OnTouchEvent to the parent.This answer:
https://stackoverflow.com/a/13540006/3956566 gives a good visualisation of how the propagation of touch events passes through:
parent -> child|parent -> child|parent -> child views.OnInterceptTouchEventfor the parent.This example taken from Managing Touch Events in a ViewGroup and demonstrates how to intercept the child's
OnTouchEventwhen the user is scrolling.4a.
Edit: To answer comments.
This is some code from the same link showing how to create the parameters of the rectangle around your element:
4b.