Я работаю над 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) {
//...
}
}
Есть ли способ определить пользовательский жест, установленный брендом смартфона? Это мой xiaomi, по умолчанию для скриншота установлено 3 пальца, я хочу проверить, есть ли что-то, что использует 3 пальца, и отключить его во время работы моего приложения, предупредив игрока.
Нашел проблему. У моего смартфона есть жест с тремя пальцами для скриншота, поэтому это вызывает ACTION_CANCEL в onTouchEvent GLSurfaceView. Больше ничего не происходит, потому что в Activity нет onTouchEvent. Добавив это, я могу управлять следующими событиями. Все новые события входят в onTouchEvent в Activity, onTouchEvent из GLSurfaceView никогда не вызывается, поэтому в Activity я делаю следующее: if (e.getActionMasked ()! = MotionEvent.ACTION_CANCEL) return this.glSurfaceView.onTouchEvent (e); еще {