Есть определенные сомнения, но все таки вдруг такое поведение возможно.
Суть: у меня есть 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 срабатывал "сквозь" клики?
Ответ
Можно попробовать вот так:
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;
Комментариев нет:
Отправить комментарий