SemiClosedSlidingDrawer onClick не отправляется в полусвернутом состоянии

я использую SemiClosedSlidingDrawer (http://pastebin.com/FtVyrcEb), и я добавил часть содержимого некоторые кнопки в верхней части ползунка, которые всегда видны.

Проблема в том, что они кликабельны (или событие нажатия отправляется) только тогда, когда ползунок полностью открыт...
Когда ползунок "полуоткрыт", событие щелчка не кажется отправленным на кнопку...
Я проверил с помощью отладчика onInterceptTouchEvent() и в обоих случаях (открытый/полусвернутый) следующий код

 @Override


     public boolean onInterceptTouchEvent(MotionEvent event) {
            if (mLocked) {
                return false;
            }

            final int action = event.getAction();
            float x = event.getX();
            float y = event.getY();

            final Rect frame = mFrame;
            final View handle = mHandle;

            handle.getHitRect(frame);

            //FOLLOWING THE CRITICAL CODE
            if (!mTracking && !frame.contains((int) x, (int) y)) { 
            return false; 
            }

 

вернуть false, но только когда слайдер открыт, событие было отправлено... Он проверяет, содержится ли (x, y) относительно щелчка в прямоугольнике, созданном, начиная с представления HandleButton выдвижного ящика...

 

    final Rect frame = mFrame;
          final View handle = mHandle;
          handle.getHitRect(frame);

и это, очевидно, неверно, потому что я нажимаю кнопку, содержащуюся внутри части содержимого выдвижного ящика, и это нормально...
Как я уже сказал выше, проблема в том, что в полусвернутом состоянии кнопки, содержащиеся в части содержимого, не прием события...

Есть ли у вас какие-либо идеи, как я могу решить эту проблему?
Может ли быть какое-то состояние выдвижного ящика, чтобы избежать щелчка дочерних элементов при сворачивании?
Заранее спасибо...


person Davide    schedule 14.08.2013    source источник
comment
У меня такая же проблема. Вы нашли решение?   -  person lordmegamax    schedule 20.01.2014


Ответы (1)


Хорошо, я думаю, что нашел способ сделать это.

Сначала вам нужно изменить onInterceptTouchEvent(), чтобы он возвращал true всякий раз, когда пользователь нажимает на видимое содержимое в полуоткрытом состоянии. Так, например, если ваше представление SemiClosedSlidingDrawer расположено в самом низу экрана, вы можете использовать простой алгоритм обнаружения, например:

public boolean onInterceptTouchEvent(MotionEvent event) {
    ...
    handle.getHitRect(frame);

    // NEW: Check if the user pressed on the "semi-open" content (below the handle):
    if(!mTracking && (y >= frame.bottom) && action == MotionEvent.ACTION_DOWN) {
        return true;
    }

    if (!mTracking && !frame.contains((int) x, (int) y)) {
    ...
}

Теперь сенсорные события во время взаимодействия пользователя с полуоткрытым контентом будут отправляться на onTouchEvent(). Теперь нам просто нужно перехватить эти события и «вручную» перенаправить их в правильное представление (обратите внимание, что нам также нужно сместить координаты для дочернего представления):

public boolean onTouchEvent(MotionEvent event) {
    ...
    if (mTracking) {
        ...
    }
    else
    {
        // NEW: Dispatch events to the "semi-open" view:
        final Rect frame = mFrame;
        final View handle = mHandle;
        handle.getHitRect(frame);

        float x = event.getX();
        float y = event.getY() - frame.bottom;

        MotionEvent newEvent = MotionEvent.obtain(event);
        newEvent.setLocation(x, y);
        return mContent.dispatchTouchEvent(newEvent);
    }

    return mTracking || mAnimating || super.onTouchEvent(event);
}

Это немного запутанная реализация, но я думаю, что основная концепция верна. Дайте мне знать, как это работает для вас!

person DPR    schedule 18.02.2015