#java #android #android_on_click #ontouchlistener
Есть определенные сомнения, но все таки вдруг такое поведение возможно. Суть: у меня есть FrameLayout (отсюда) с событием onTouch для зуминга. В этом Frame есть несколько элементов, которые принимают события onClick и onLongClick: for (int i = 0; i < locations.size(); i++) { locations.get(i).getView().setOnClickListener(onPoleClick); locations.get(i).getView().setOnLongClickListener(onPoleLongClick); } если я выставляю слушателя на клик - перестает действовать MyFrame.onTouch и поле не зумится. Если убираю - соответственно, сижу без кликов, но с зумящимся полем. Если ставлю return false; в MyFrame.onTouch, он также перестает работать. Пробовал заменить locations.get(i).onClick на onTouch (MotionEvent.UP) - при return true клик до Frame не доходит, при return false MotionEvent.UP не срабатывает. MotionEvent.DOWN не даст обработать onLongClick... Дудочка и кувшинчик, в общем. Может быть есть какой-то способ, чтобы onTouch срабатывал "сквозь" клики?
Ответы
Ответ 1
Можно попробовать вот так: public class ZoomFrameLayout extends FrameLayout { public ZoomFrameLayout(Context context) { super(context); } public ZoomFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); } public ZoomFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean upper = super.onInterceptTouchEvent(ev); if (!upper) { // Детектим жесты здесь стандартным детектором // и если зум - отрабатываем и выставляем return true } return upper; } } Т.е. вид ZoomFrameLayout будет забирать себе только зум, а клики уйдут детишкам. И кстати при таком использовании ScaleDetector будут все события перехватываться (там return true в конце). Можно попробовать что-нибуть вроде if (scaleDetector.isInProgress()) return true;Ответ 2
Просто совместите оба действия в onTouch: private int min=50; private int x, dx; public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_DOWN) { x = event.getX(); } else if(event.getAction()==MotionEvent.ACTION_UP) { dx = event.getX(); if (Math.abs( dx - x ) > min) { // зум } else { // клик } } }
Комментариев нет:
Отправить комментарий