Android: передать событие touch to underlaying view
У меня есть следующая иерархия: Activity
→ PopupWindow
→ CustomView
Мой 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;
}
});
Что-нибудь еще, что мне нужно сделать, чтобы делегировать событие касания полностью на активность?
Ответы
Ответ 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 и вызвать функцию увольнения(), когда есть клик за пределами круга?