I am working through debugging some touch handling stuff on Android, and am trying to figure out why the MotionEvent sent to my View's onTouchListener
contains a cancel action. I have not been able to find any documentation on its cause, and was hoping someone could point me in the right direction for debugging this problem - error codes, source code, or some general knowledge.

- 35,852
- 23
- 123
- 164
-
What do you mean by cancel action? What code are you using? – 0gravity Aug 14 '12 at 21:18
-
@0gravity, I mean if `event.getAction() == MotionEvent.ACTION_CANCEL` – Phil Aug 14 '12 at 21:20
5 Answers
Is this what you are looking for:
"ACTION_CANCEL occurs when the parent takes possession of the motion, for example when the user has dragged enough across a list view that it will start scrolling instead of letting you press the buttons inside of it. You can find out more about it at the viewgroup documentation: onInterceptTouchEvent."
Hope that is the answer you are looking for:
Resources: Motion Event, Stack Overflow.
All you need is to call
requestDisallowInterceptTouchEvent(true);
on the parent view, like this -
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
view.getParent().requestDisallowInterceptTouchEvent(true);
switch(motionEvent.getActio){
}
return false;
}
Source: onInterceptTouchEvent, onTouchEvent only see ACTION_DOWN

- 761
- 11
- 24
ACTION_CANCEL
is triggered by ancestor to notify all descendants that they lost onTouch
control and it's will be responsible for handling the next onTouch
event. Usually it is caused when a descendant returned true in onTouch
or onTouchEvent
method but after that, during the next of touch event of gesture, an ancestor returned true in onInterceptTouchEvent()

- 29,217
- 8
- 193
- 205
In my situation, TouchDelegate helped.
https://medium.com/android-news/android-change-touch-area-of-view-by-touchdelegate-fc19f2a34021
private fun changeTouchableAreaOfView(view: View, extraSpace: Int) {
val parent = view.parent as View
Observable.just(parent)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe {
val touchableArea = Rect()
view.getHitRect(touchableArea)
touchableArea.top -= extraSpace
touchableArea.bottom += extraSpace
touchableArea.left -= extraSpace
touchableArea.right += extraSpace
parent.touchDelegate = TouchDelegate(touchableArea, button)
}
/* In case you don't want to use Rx java
parent.post {
val touchableArea = Rect()
button.getHitRect(touchableArea)
touchableArea.top -= extraSpace
touchableArea.bottom += extraSpace
touchableArea.left -= extraSpace
touchableArea.right += extraSpace
parent.touchDelegate = TouchDelegate(touchableArea, button)
}
*/
}

- 346
- 5
- 11
When the drag moves out of view rect, you get ACTION_CANCEL

- 1,089
- 8
- 19
-
1This does not happen at all times, even when the finger is already outside the boundaries of the touched view ACTION_CANCEL won't be called but ACTION_UP. – Compaq LE2202x Oct 31 '13 at 07:30