MotionEvent.ACTION_OUTSIDE запускается для событий внутри, когда установлен FLAG_NOT_TOUCHABLE - PullRequest
0 голосов
/ 08 ноября 2018

Мой код работает, но из спецификации 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

...