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?
- Sistema Android Trace
- Hacer fondo transparente de los iconos de Android en eclipse
- ¿Por qué el teclado virtual muestra o no cuando se inicia una actividad?
- Disposición de la lista vacía de Android
- Una forma más eficiente de actualizar la interfaz de usuario del servicio que las intenciones?
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?
- Android sendevent es realmente lento - ¿cómo acelerarlo?
- Android, cómo desenfocar / vidrio / helada actividad actual
- ¿Cómo puedo hacer un diamante ShapeDrawable?
- ¿Alguien implementó (o consiguió más información) en Android SyncObserver
- ¿Buenas herramientas para desarrollar una GUI en Android?
- Arrastrar y soltar para poner elementos de List1 a List2
- Establecer atributos (margen, gravedad, etc ...) en una vista de Android mediante programación (sin XML)
- Aplicación de la plantilla de PSD de Photoshop para Android
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 Studio 0.8.2 – Falló la sincronización del proyecto de Gradle
- Cómo guardar la clave del API en gradle.properties