Cómo implementar Swipe en Android juego sin vista

Estoy tratando de hacer un juego Snake en Android en el que la serpiente se mueve con gestos de deslizamiento.

He intentado muchas maneras de conseguir esto hecho pero ningunos de ellos parecen trabajar para mí. No he implementado una vista – ¿será un problema?

Esta es una muestra que intenté implementar basándome en una pregunta anterior de StackOverflow – Android: Cómo manejar los gestos de deslizamiento de derecha a izquierda .

Creé OnSwipeTouchListener.java según las instrucciones. Me encontré con un poco de un problema con el uso, sin embargo.

En GameScreen.java (que es donde van todos los eventos táctiles), he añadido esto como una muestra –

onSwipeTouchListener = new OnSwipeTouchListener() { public void onSwipeTop() { Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show(); } public void onSwipeRight() { Toast.makeText(MyActivity.this, "right", Toast.LENGTH_SHORT).show(); } public void onSwipeLeft() { Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show(); } public void onSwipeBottom() { Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show(); } }; imageView.setOnTouchListener(onSwipeTouchListener); 

Esto provoca que un montón de errores aparezcan (principalmente con imageView), y ninguno de ellos podría ser resuelto.

¿Alguien pasaría a tener una implementación alternativa de golpe específico a mi caso?

Si u tiene acceso a eventos táctiles, intente esto

  int len = touchEvents.size(); Graphics g = game.getGraphics(); for (int i = 0; i < len; i++) { TouchEvent event = touchEvents.get(i); if (event.type == TouchEvent.TOUCH_DOWN) { x1=event.x; y1=event.y; } if (event.type == TouchEvent.TOUCH_UP) { x2=event.x; y2=event.y; dx=(x2-x1); dy=(y2-y1); tu=1; } if((tu==1) && (Math.abs(dx)>Math.abs(dy))) { if(dx>0) { if(!(robot.getSpeedX()<0)) { robot.stop(); robot.moveRight(); } } else { if(!(robot.getSpeedX()>0)) { robot.stop(); robot.moveLeft(); } } tu=0; } if((tu==1) && (Math.abs(dx)<=Math.abs(dy))) { if(dy>0) { if(!(robot.getSpeedY()<0)) { robot.stop(); robot.moveDown(); } } else { if(!(robot.getSpeedY()>0)) { robot.stop(); robot.moveUp(); } } tu=0; } 

Puede hacer esto de dos maneras:

Opción 1:

Dentro de la clase de actividad subyacente de tu juego:

 class MyGestureDetector extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { float slope = (e1.getY() - e2.getY()) / (e1.getX() - e2.getX()); float angle = (float) Math.atan(slope); float angleInDegree = (float) Math.toDegrees(angle); // left to right if (e1.getX() - e2.getX() > 20 && Math.abs(velocityX) > 20) { if ((angleInDegree < 45 && angleInDegree > -45)) { //code for left to right swipe should go here } // right to left fling } else if (e2.getX() - e1.getX() > 20 && Math.abs(velocityX) > 20) { if ((angleInDegree < 45 && angleInDegree > -45)) { //code for right to left swipe should go here } } return true; } catch (Exception e) { // nothing } return false; } } 

A continuación, puede registrar cualquier vista para recibir / escuchar los gestos:

  final GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector()); gameView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) return false; return false; } }); //the parent layout findViewById(R.id.parent_layout).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) return false; return false; } }); //an image view findViewById(R.id.image_view).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) return false; return false; } }); 

Opcion 2:

Si la clase GameScreen tiene acceso directo a eventos táctiles, puede leerlos e implementar una lógica para acciones de desplazamiento. El código para eso es similar a la respuesta de Mostafa Gazar.

Debes publicar tu GameScreen como Nana Ghartey

Asumiendo que usted tiene acceso a los datos del tacto usted puede hacer algo como el siguiente

 private static final int DEFAULT_THRESHOLD = 36;// Better to be something in dps. ... = new View.OnTouchListener() { int initialX = 0; int initialY = 0; final float slop = ViewConfiguration.get(context).getScaledTouchSlop(); public boolean onTouch(final View view, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { initialX = (int) event.getX(); initialY = (int) event.getY(); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { int currentX = (int) event.getX(); int currentY = (int) event.getY(); int offsetX = currentX - initialX; int offsetY = currentY - initialY; if (Math.abs(offsetX) > slop) { if (offsetX > DEFAULT_THRESHOLD) { // TODO :: Do Right to Left action! } else if (offsetX < -DEFAULT_THRESHOLD) { // TODO :: Do Left to Right action! } } if (Math.abs(offsetY) > slop) { if (offsetY > DEFAULT_THRESHOLD) { // TODO :: Do Bottom to Top action! } else if (offsetY < -DEFAULT_THRESHOLD) { // TODO :: Do Top to Bottom action! } } } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { // Do nothing! } }; 

Lo bueno de esta implementación es que el usuario no tendrá que quitarle la mano de la pantalla mientras controla la dirección de la serpiente.

Ponga los métodos estupendos en su código, ejemplo:

 public void onSwipeTop() { super.onSwipeTop(); Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show(); } 
  • Android: Cuando configuro OnClickListener para un ListView
  • Desde un uso de servicio: runOnUiThread o AsyncTask o Handler o Post
  • ¿Cuál es el equivalente a Android de findViewById (int) de Android?
  • Android: imageview dentro del botón
  • Android: ¿Cómo cambio la imagen de un ImageButton cuando el usuario suelta el botón?
  • ¿La mejor manera de crear Barra de progreso segmentada?
  • Barra de progreso redondeada en ambos lados en android
  • Cómo obtener el tamaño total de la pantalla en un dispositivo android programaticamente
  • Cómo hacer una interfaz de usuario avanzada en Android?
  • Flujo textview alrededor de la imagen
  • Portar aplicaciones java a la plataforma Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.