Обработка onTouchEvent и onTouch между родительской ViewGroup с масштабированием и дочерним ImageView?

У меня есть пользовательская группа ZoomableViewGroup, которая переопределяет onTouchEvent для обработки движений панорамирования/отбрасывания и использует ScaleGestureDetector.SimpleOnScaleGestureListener для обработки жестов масштабирования. Эта ZoomableViewGroup работает нормально, пока я не попытаюсь использовать onTouch в дочерних элементах ViewGroup.

Внутри этой ZoomableViewGroup у меня есть несколько изображений ImageView, которые служат кнопками. Я хотел бы, чтобы функциональность родителя имела приоритет над onTouch детей. В нынешнем виде кажется, что дочерние ImageViews перехватывают сенсорные события и не передают их своему родителю.

Я хотел бы знать, каков хороший метод обеспечения того, чтобы родительская сенсорная функциональность сохранялась по сравнению с детской сенсорной функциональностью.

Любая помощь или предложения будут с благодарностью!

ИЗМЕНИТЬ:

Ваш ответ был чрезвычайно полезным, Джейсон, я думаю, что теперь я начинаю лучше понимать эту ситуацию. Я возился с моими масштабируемыми группами просмотра в методе InterceptTouchEvent, но все еще немного смущен

  • вы касаетесь экрана над ImageView внутри моей масштабируемой ViewGroup,
  • ViewGroup.onInterceptYouchEvent получает ACTION_DOWN
  • я хочу, чтобы моя ViewGroup действовала, ЕСЛИ событие является жестом панорамирования или масштабирования, поэтому я верну 'true' для ACTION_DOWN
  • похоже, что когда моя группа просмотра использует событие ACTION_DOWN, она отправляет мой ImageView.onTouch 'ACTION_CANCEL'
  • Я хочу, чтобы мой метод ImageView.onTouch реагировал на событие ACTION_UP, если предшествующее ему ACTION_MOVE меньше значения slop.

как мой ImageView должен получить соответствующую информацию ACTION_UP, если он уже получил ACTION_CANCEL от своей родительской ViewGroup?

пожалуйста, поправьте меня, если я тоже неправильно интерпретирую то, что здесь происходит! Еще раз спасибо!


person Will Thomson    schedule 27.12.2014    source источник
comment
Если вы хотите перехватывать события касания только после того, как оно было перетащено за значение наклона, вам следует возвращать false из метода onInterceptTouchEvent() до тех пор, пока это не произойдет.   -  person corsair992    schedule 29.12.2014


Ответы (1)


Основная идея состоит в том, чтобы переопределить onInterceptTouch в родительском представлении и предоставить там логику для того, передавать ли касание дочернему представлению (возврат false) или фактически разрешить родительскому представлению перехватывать/использовать касание (возврат true). Ваша логика может быть пространственной (возможно, края родительского вида являются особыми, но не внутренней частью) или жестами (возможно, горизонтальные движения вызывают что-то на уровне родительского вида, а вертикальные движения вызывают что-то на уровне дочернего вида или, в вашем случае простые нажатия передаются дочерним кнопкам, но два жеста пальца используются родительскими).

person JASON G PETERSON    schedule 27.12.2014
comment
Я внес изменения в свой вопрос, если вы не против помочь мне еще немного. Еще раз спасибо Джейсон! - person Will Thomson; 29.12.2014
comment
Я думаю, что Corsair прав, но это сбивает с толку. Возможно, опубликуйте свой метод onInterceptTouch(), если его предложение не поможет. - person JASON G PETERSON; 29.12.2014