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.
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
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()
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)
}
*/
}
When the drag moves out of view rect, you get ACTION_CANCEL
© 2022 - 2024 — McMap. All rights reserved.
event.getAction() == MotionEvent.ACTION_CANCEL
– Arawakan