El GestureDetector no funciona (ejemplo de desarrollador android)

Estoy leyendo el gesto en android en android desarrollador, y siguiendo el tutorial he intentado ejecutar los siguientes códigos:

public class MainActivity extends Activity implements OnGestureListener, OnDoubleTapListener { private static final String DEBUG_TAG = "Gestures"; private GestureDetectorCompat mDetector; // Called when the activity is first created. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View v = new RelativeLayout(this); v.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); setContentView(v); mDetector = new GestureDetectorCompat(this, this); mDetector.setOnDoubleTapListener(this); } @Override public boolean onTouchEvent(MotionEvent event) { this.mDetector.onTouchEvent(event); return super.onTouchEvent(event); } @Override public boolean onDown(MotionEvent event) { Log.d(DEBUG_TAG, "onDown: " + event.toString()); return true; } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString()); return true; } @Override public void onLongPress(MotionEvent event) { Log.d(DEBUG_TAG, "onLongPress: " + event.toString()); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.d(DEBUG_TAG, "onScroll: " + e1.toString() + e2.toString()); return true; } @Override public void onShowPress(MotionEvent event) { Log.d(DEBUG_TAG, "onShowPress: " + event.toString()); } @Override public boolean onSingleTapUp(MotionEvent event) { Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString()); return true; } @Override public boolean onDoubleTap(MotionEvent event) { Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString()); return true; } @Override public boolean onDoubleTapEvent(MotionEvent event) { Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString()); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent event) { Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString()); return true; } } 

Los códigos vinieron del sitio aquí .

Pero cuando ejecuté la aplicación, no recibí información de depuración al hacer clic o presionar largo la vista.

BTW, probar la aplicación en el emulador y htc e1 dispositivo.

¿Cuál es el problema?

Estás creando un GestureDetector pero nunca lo estás "conectando" a tu View. Intente cambiar su onCreate de esta manera:

 super.onCreate(savedInstanceState); View v = new RelativeLayout(this); v.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); setContentView(v); mDetector = new GestureDetectorCompat(this, this); mDetector.setOnDoubleTapListener(this); v.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View v, MotionEvent me){ return mDetector.onTouchEvent(me); } }); 

Poco tarde, pero mi solución de este problema es:

 @Override public boolean onTouchEvent(MotionEvent event) { this.mDetector.onTouchEvent(event); return super.onTouchEvent(event); } 

El regreso del detector se perdió. Cambiar a:

 @Override public boolean onTouchEvent(MotionEvent event) { if (this.mDetector != null) return this.mDetector.onTouchEvent(event); return super.onTouchEvent(event); } 

¿Pero es esto una buena solución? Tiempo para Android Insider. 😉

Tschau Fred

He editado tu primera línea:

 public class MainActivity extends Activity implements OnGestureListener, OnDoubleTapListener { 

Utilicé tu código pero proporcioné los nombres completos de la interfaz así:

 public class MainActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { 

Esto funcionó después de las ediciones. Espero que esto ayude.

Aquí está el sencillo código de Android para la detección de la dirección del gesto :

MainActivity.java

 import java.util.ArrayList; import android.app.Activity; import android.gesture.Gesture; import android.gesture.GestureLibraries; import android.gesture.GestureLibrary; import android.gesture.GestureOverlayView; import android.gesture.GestureOverlayView.OnGesturePerformedListener; import android.gesture.GestureStroke; import android.gesture.Prediction; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends Activity implements OnGesturePerformedListener { GestureOverlayView gesture; GestureLibrary lib; ArrayList<Prediction> prediction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lib = GestureLibraries.fromRawResource(MainActivity.this, R.id.gestureOverlayView1); gesture = (GestureOverlayView) findViewById(R.id.gestureOverlayView1); gesture.addOnGesturePerformedListener(this); } @Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { // TODO Auto-generated method stub ArrayList<GestureStroke> strokeList = gesture.getStrokes(); // prediction = lib.recognize(gesture); float f[] = strokeList.get(0).points; String str = ""; if (f[0] < f[f.length - 2]) { str = "Right gesture"; } else if (f[0] > f[f.length - 2]) { str = "Left gesture"; } else { str = "no direction"; } Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show(); } } 

Activity_main.xml

 <android.gesture.GestureOverlayView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:android1="http://schemas.android.com/apk/res/android" xmlns:android2="http://schemas.android.com/apk/res/android" android:id="@+id/gestureOverlayView1" android:layout_width="match_parent" android:layout_height="match_parent" android1:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Draw gesture" android:textAppearance="?android:attr/textAppearanceMedium" /> </android.gesture.GestureOverlayView> 
  • Fling Gesture y Webview en Android
  • ListView no se desplaza dentro de la aleta de vista en android
  • Diferencia entre hacer clic y tocar en Android
  • ¿Cómo puede un servicio escuchar los gestos / eventos táctiles?
  • Canvas.drawLines mostrando segmentos disjuntos
  • ¿Se admite multi-touch / gestos en todos los navegadores de teléfonos inteligentes (Android e iOS)?
  • Android - evitar copiar / pegar edittext y pulsar dos veces todo
  • Cómo generar el gesto de zoom / pellizco para probar para Android
  • onDoupleTap no se dispara
  • ¿Cómo detectar el toque de dos dedos en Android?
  • ¿Cómo agregar GestureOverlayView a mi clase SurfaceView, cómo agregar a la jerarquía de vista?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.