ACTION_CANCEL сгенерирован и потерял данные

Я работаю над 2D-игрой для Android, в которой используются 3 пальца: один или два находятся на экране, а остальные касаются и отпускают. Некоторые виды использования пальцев, некоторые быстро. это игра, в которой персонаж ходит / бегает, прыгает, стреляет…

Моя проблема в том, что он работает нормально, но иногда создается ACTION_CANCEL, и я теряю данные пальцев.

Например, если я одновременно нажимаю 3 пальца, которые обнаруживаю в onTouchEvent: ACTION_DOWN, ACTION_POINTER_DOWN (1), ACTION_POINTER_DOWN (2), ACTION_CANCEL.

Но и во время обычной игры иногда генерируется ACTION_CANCEL. Пальцы находятся на экране, но все данные MotionEvent отменяются .. следующее касание перезапускается с ACTION_DOWN. Так что я не могу управлять игрой.

Кто-нибудь знает, как решить мою проблему? Спасибо

Я использую этот (общий) код:

public class world extends Activity {
    GLSurfaceView glSurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        this.setVolumeControlStream(AudioManager.STREAM_MUSIC);

        this.glSurfaceView = new worldGL(this);
        setContentView(this.glSurfaceView);
    }

}

class worldGL extends GLSurfaceView {
    world activity;
    world_r renderer;

    public worldGL(Context context){
        super(context);

        this.activity = (world) context;
        this.renderer = new world_r(context);
        setRenderer(this.renderer);

        //...
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        //...

        return true;
    }

}

public class world_r implements Renderer {

    public world_r(Context context) {
        //...
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int w, int h) {
        //...
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //...
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        //...
    }

}

Нашел проблему. У моего смартфона есть жест с тремя пальцами для скриншота, поэтому это вызывает ACTION_CANCEL в onTouchEvent GLSurfaceView. Больше ничего не происходит, потому что в Activity нет onTouchEvent. Добавив это, я могу управлять следующими событиями. Все новые события входят в onTouchEvent в Activity, onTouchEvent из GLSurfaceView никогда не вызывается, поэтому в Activity я делаю следующее: if (e.getActionMasked ()! = MotionEvent.ACTION_CANCEL) return this.glSurfaceView.onTouchEvent (e); еще {

Boy80 28.06.2018 20:04

Есть ли способ определить пользовательский жест, установленный брендом смартфона? Это мой xiaomi, по умолчанию для скриншота установлено 3 пальца, я хочу проверить, есть ли что-то, что использует 3 пальца, и отключить его во время работы моего приложения, предупредив игрока.

Boy80 29.06.2018 09:31
0
2
69
0

Другие вопросы по теме