Overriding onTouchEvent competing with ScrollView

brk3 picture brk3 · Jun 1, 2011 · Viewed 18.1k times · Source

From a simplistic overview I have a custom View that contains some bitmaps the user can drag around and resize.

The way I do this is fairly standard as in I override onTouchEvent in my CustomView and check if the user is touching within an image, etc.

My problem comes when I want to place this CustomView in a ScrollView. This works, but the ScrollView and the CustomView seem to compete for MotionEvents, i.e. when I try to drag an image it either moves sluggishly or the view scrolls.

I'm thinking I may have to extend a ScrollView so I can override onInterceptTouchEvent and let it know if the user is within the bounds of an image not to try and scroll. But then because the ScrollView is higher up in the hierarchy how would I get access to the CustomView's current state?

Is there a better way?

Answer

adamp picture adamp · Jun 1, 2011

Normally Android uses a long press to begin a drag in cases like these since it helps disambiguate when the user intends to drag an item vs. scroll the item's container. But if you have an unambiguous signal when the user begins dragging an item, try getParent().requestDisallowInterceptTouchEvent(true) from the custom view when you know the user is beginning a drag. (Docs for this method here.) This will prevent the ScrollView from intercepting touch events until the end of the current gesture.