Подтвердить что ты не робот

Android: передать событие touch to underlaying view

У меня есть следующая иерархия: ActivityPopupWindowCustomView

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

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

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

Теперь отсутствующая часть отправляет любое событие касания, которое происходит внутри PopupWindow, но вне CustomView (круга) для Activity.

Я уже знаю, как ощущать, когда прикосновение выходит за пределы моего круга. У меня просто проблемы, делегирующие его в 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;
    }
});

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

4b9b3361

Ответ 1

Рассмотрим 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);

Ответ 2

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

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

и

window.setTouchable(true);

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

[Примечание. Это для onTouch() для вызова вызываемых событий.]

Ответ 3

Слишком плохо, что PopupWindow не является подклассом ViewGroup или даже View. Тогда вы можете переопределить dispatchTouchEvent. Можете ли вы изменить свой пользовательский вид, чтобы узнать о PopupWindow и вызвать функцию увольнения(), когда есть клик за пределами круга?