Android: делегировать событие касания в нижележащий вид - PullRequest
21 голосов
/ 30 сентября 2010

У меня есть следующая иерархия: Activity -> PopupWindow -> CustomView

Мой PopupWindow сам по себе квадратный, но прозрачный, поэтому вы можете видеть действие, сидящее на заднем плане. CustomView - это круг, встроенный во всплывающее окно. alt text

То, чего я до сих пор достиг, это

  1. Пользователь нажимает на зеленый кружок, и я вызываю "некоторые вещи"
  2. Пользователь щелкает за пределами PopupWindow, и событие касания отправляется в действие.

Пропавшая часть теперь предназначена для отправки любого события касания, которое происходит внутри PopupWindow, но за пределами CustomView (круг), в действие.

Я уже знаю, как чувствовать, когда прикосновение находится за пределами моего круга. У меня просто проблемы с делегированием этого в Activity.

В моем CustomView у меня есть следующее в onTouch

if (radiusTouch > maxRadius) {
    return false;
}

В моем PopupWindow я уже настроил следующее, но оно никогда не вызывается:

popup.setTouchInterceptor(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.i(TAG, "PopupWindow :: onTouch()");
        return false;
    }
});

Что еще мне нужно сделать, чтобы делегировать событие касания полностью в Activity?

Ответы [ 3 ]

12 голосов
/ 11 января 2011

Рассмотрим FLAG_NOT_TOUCH_MODAL:

/** Window flag: Even when this window is focusable (its
  * {@link #FLAG_NOT_FOCUSABLE is not set), allow any pointer events
  * outside of the window to be sent to the windows behind it.  Otherwise
  * it will consume all pointer events itself, regardless of whether they
  * are inside of the window. */
public static final int FLAG_NOT_TOUCH_MODAL    = 0x00000020;

Вы можете использовать этот код для обновления флагов окна после было показано всплывающее окно.

FrameLayout popupContainer = (FrameLayout)contentView.getParent();
WindowManager.LayoutParams p = (WindowManager.LayoutParams)popupContainer.getLayoutParams();
p.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
windowManager.updateViewLayout(popupContainer, p);
3 голосов
/ 28 апреля 2011

Попробуйте установить их в своем экземпляре PopupWindow:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

и

window.setTouchable(true);

Это всего лишь предложение ... Я не проверял это.Дайте мне знать, если это работает.

[Примечание: это для onTouch (), чтобы вызываться при сенсорных событиях ..]

0 голосов
/ 06 декабря 2010

Очень плохо, что PopupWindow не является подклассом ViewGroup или даже View. Тогда вы можете переопределить dispatchTouchEvent. Можете ли вы изменить свое собственное представление, чтобы узнать о PopupWindow и вызвать dismiss () для него, когда за пределами круга есть щелчок?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...