Мой код работает, но из спецификации Android неясно, могу ли я положиться на свою реализацию на разных платформах Android:
Область:
Я создаю плавающее окно, охватывающее всю ширину и высоту экрана. Он не должен реагировать на любые сенсорные события и передавать их основной деятельности (которая часто является третьей стороной, а не моим приложением). Тем не менее, мне также нужно получить одно событие, когда происходит касание (без необходимости знать, где произошло касание), чтобы затем я мог одновременно закрыть плавающее окно. (По сути, это немое наложенное окно со стрелкой со знаком «нажмите здесь»)
Реализация:
Мне удалось добиться этого с помощью приведенного ниже кода, потому что с FLAG_NOT_TOUCHABLE MotionEvent.ACTION_OUTSIDE, похоже, срабатывает для всех событий касания, независимо от того, находятся они внутри или снаружи окна . (В моем случае они всегда внутри)
params = WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) WindowManager.LayoutParams.TYPE_SYSTEM_ALERT else WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT)
someView.setOnTouchListener { view: View, motionEvent: MotionEvent ->
Log.d(TAG, "New event " + motionEvent.action)
true
}
windowManager?.addView(someView, params)
Проблема:
Из спецификации не ясно, следует ли ожидать, что все версии Android будут вести себя так, потому что, на мой взгляд, то, что я вижу, противоречит спецификации, а именно: получение MotionEvent .ACTION_OUTSIDE событие для сенсорных событий внутри окна.
Флаг окна: если вы установили FLAG_NOT_TOUCH_MODAL, вы можете установить это
флаг для получения одного специального события MotionEvent с действием
MotionEvent.ACTION_OUTSIDE для касаний, которые происходят за пределами вашего
окно. Обратите внимание, что вы не получите полный жест вниз / движение / вверх,
только местоположение первого вниз как ACTION_OUTSIDE.
Проверено на: Nexus 5X API 28 AVD