Проведите пальцем, чтобы выйти из режима погружения, подхватывается событиями касания холста

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

Проблема в том, что когда пользователь проводит пальцем от верхней части экрана, чтобы выйти из режима погружения, этот жест воспринимается холстом.

Как избежать обработки этих событий касания на холсте?

Класс SurfaceView

public class PEQSurfaceView extends SurfaceView implements 
SurfaceHolder.Callback
{

   @Override
   public void surfaceCreated(SurfaceHolder holder)
   {
       // make the GamePanel focusable so it can handle events
       requestFocus();
       setFocusable(true);
       setFocusableInTouchMode(true);
   }

   @Override
   public boolean onTouchEvent(MotionEvent event)
   {...}

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


person behelit    schedule 01.10.2018    source источник
comment
Не уверен, что это будет соответствовать вашим ожиданиям, но в качестве предложения я бы сделал это следующим образом: 1) оставьте некоторую верхнюю область экрана для жеста перемещения вне погружения 2) затем в методе onTouchEvent проверьте координату Y, если она находится внутри этого верхняя область (я думаю, 10dp будет достаточно), затем верните false (это отключит обработку события в SurfaceView). Поэтому, если пользователь проведет пальцем вниз вправо от верхнего края экрана, это сработает.   -  person Konstantin Volkov    schedule 01.10.2018
comment
Спасибо за предложение, но, к сожалению, оно не совсем подходит для этого приложения. Холст требует как можно больше места, а сенсорные события должны иметь возможность занимать всю высоту экрана.   -  person behelit    schedule 01.10.2018


Ответы (1)


Не уверен, что это соответствует вашим ожиданиям, но в качестве предложения я бы сделал это следующим образом:
1) оставьте некоторую верхнюю область экрана для жеста движения вне погружения.
2) затем в методе onTouchEvent проверьте Y координата, если она находится внутри этой верхней области (я думаю, 10dp будет достаточно), затем верните false (это отключит обработку события в SurfaceView).

Так что, если пользователь будет swipe down прямо от верхнего края экрана, это сработает.

Вероятно, вам нужно будет настроить какую-то логическую переменную и установить для нее значение true на ACTION DOWN внутри этой специальной области и отпустить ее на ACTION_UP и ACTION_CANCEL, затем внутри ACTION_MOVE, если это flag == true, тогда вам нужно вернуть true, потому что специальный жест еще не закончен. .

person Konstantin Volkov    schedule 01.10.2018
comment
Спасибо за предложение, но, к сожалению, оно не совсем подходит для этого приложения. Холст требует как можно больше места, а сенсорные события должны иметь возможность занимать всю высоту экрана. - person behelit; 04.10.2018