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?

4 Solutions collect form web for “Cómo implementar Swipe en Android juego sin vista”

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(); } 
  • El posicionamiento fijo en el navegador Android 2.3 debería funcionar ... ¿no?
  • DialogFragment en Android con tema
  • ¿Cómo aplicar gradiente a la barra de estado en android?
  • ¿Qué objeto de diseño se utiliza para producir una ventana emergente "burbuja" en una interfaz de usuario de Android? (No Tostada o Diálogo)
  • Diseño de GUI LCD de 5.7 "de 640x480 de diseño Android
  • Android: actividad que no llena la pantalla principal
  • FragmentActivity TabHost con Fragmento y Actividad
  • Creación de una biblioteca de interfaz de usuario de Android con un extremo frontal personalizable
  • Desde un uso de servicio: runOnUiThread o AsyncTask o Handler o Post
  • ¿Cómo detectar el movimiento de Google MapView en Android?
  • ¿Cómo puedo permitir que un usuario reordene los elementos en una lista?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.