Gestos verticales y horizontales en Android

Me gustaría que mi GestureOverlayView detectara gestos tanto puramente horizontales como verticales.

De http://android-developers.blogspot.com/2009/10/gestures-on-android-16.html

"Orientación: indica la orientación de desplazamiento de las vistas de abajo.En este caso, la lista se desplaza verticalmente, lo que significa que cualquier gestos horizontales (como action_delete) puede ser reconocido inmediatamente como un gesto.Gestos que comienzan con un trazo vertical debe contener al menos un En otras palabras, una línea vertical simple no puede ser reconocida como un gesto ya que estaría en conflicto con el desplazamiento de la lista. "

Parece un catch-22, si el androide: la orientación se establece en vertical, sólo puedo tener swipes horizontal, y si el androide: la orientación se establece en horizontal, sólo puedo tener swipes verticales. ¿Cómo puedo evitar este requisito?

4 Solutions collect form web for “Gestos verticales y horizontales en Android”

Me había topado con este problema en un hackathon. No hay forma de que puedas resolverlo con GestureOverlayView, por lo que tienes que usar eventos de movimiento. GestureOverlayView sin embargo funciona con gestos un poco más "detallados", como un círculo. Lo que he notado es que GestureOverlayView funciona mejor para figuras cerradas. Por lo tanto, motionEvent sensor es. Encontré el código aquí . También he modificado la respuesta de gav para los swipes verticales. No lo he probado aunque, pero positivo que debería funcionar.

He aquí un ejemplo:

public class SelectFilterActivity extends Activity implements OnClickListener { private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_MAX_OFF_PATH = 250; private static final int SWIPE_THRESHOLD_VELOCITY = 200; private GestureDetector gestureDetector; View.OnTouchListener gestureListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* ... */ // Gesture detection gestureDetector = new GestureDetector(new MyGestureDetector()); gestureListener = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } }; } class MyGestureDetector extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { // downward swipe if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) Toast.makeText(SelectFilterActivity.this, "Downward Swipe", Toast.LENGTH_SHORT).show(); else if (Math.abs(e2.getY() - e1.getY()) > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) Toast.makeText(SelectFilterActivity.this, "Upward Swipe", Toast.LENGTH_SHORT).show(); // right to left swipe else if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { // nothing } return false; } } 

Añádalo ahora a las vistas donde desee la detección de gestos,

 // Do this for each view added to the grid imageView.setOnClickListener(SelectFilterActivity.this); imageView.setOnTouchListener(gestureListener); 

Espero que ayude. Saludos a Gav por el código!

Todo lo que tienes que hacer, se establece el GestureStrokeAngleThreshold a un valor más cercano a 90 (he utilizado 90f)

El valor predeterminado del threashold de ángulo es 40.0f debido a que los gestos verticales simples se omitirán

Tal vez no sea la mejor manera de hacerlo, pero podría anular el comportamiento predeterminado extendiendo GestureOverlayView

Necesitará anular el private Rect touchMove(MotionEvent event) y deshacerse de la comprobación de orientación:

 if (box.squareness > mGestureStrokeSquarenessTreshold || (mOrientation == ORIENTATION_VERTICAL ? angle < mGestureStrokeAngleThreshold : angle > mGestureStrokeAngleThreshold)) { mIsGesturing = true; ... ... } 

Es el único lugar donde la orientación se utiliza en absoluto, por lo que no hay necesidad de modificaciones extensas. Simplemente un simple extender / anular.

Por supuesto, para hacerlo bien , agregaría un ORIENTATION_NONE y comprobaría eso, como lo hicieron con el Replicant Project , pero supongo que depende de si alguna vez necesitará la funcionalidad de nuevo.

¿Has visto http://developer.android.com/training/gestures/index.html ? Necesito un poco más de información sobre lo que estás tratando de hacer con los gestos horizontales y verticales para dar consejos más específicos. Pero tener un área de toque que hace una cosa con golpes horizontales y otra cosa con golpes verticales es definitivamente posible. Es importante tampoco que busque líneas perfectamente rectas, ya que sus usuarios no podrán hacerlas.

Editar (1): ¿Has visto http://www.vogella.com/articles/AndroidGestures/article.html ? Vogella parece estar insinuando con su ejemplo que usted puede tener un gesto hacia arriba y gestos laterales en el GestureOverlayView . ¿Es esto lo que estás tratando de hacer?

  • Valores de Android a diferentes tamaños de pantalla
  • Android - diseño de xml como fondo
  • Custom TableLayout con múltiples TextViews en filas
  • GridView o TableLayout?
  • Cómo obtener el ancho / alto de un diseño en Android
  • ¿Es posible cambiar el texto de la sugerencia EditText flotante?
  • Arrastrar y soltar vista de la imagen android
  • ¿Por qué LayoutInflater ignora los parámetros layout_width y layout_height que he especificado?
  • No se puede cambiar la fuente predeterminada en la aplicación para Android
  • TextView Top Padding problema?
  • Obtener altura real de la vista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.