Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Разные действия Click, LongClick и Touch на одно и то же место

#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 { // клик } } }

Комментариев нет:

Отправить комментарий