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í .
- Algoritmo de coincidencia de patrones de forma en Java
- Onfling () no se llama por alguna razón
- Deslizar para cambiar la selección de pestañas
- Depuración de Android: java.lang.ArrayIndexOutOfBoundsException
- Uso de GestureLibrary con ScrollView
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?
- Cómo dibujar multi gesto de color en la misma superposición gesto
- android detecta si el usuario ha rozado
- Cómo manejar gestos de desplazamiento para gridview (android)
- ¿Puede explicar (cálculos matemáticos) ejemplo de gesto (Levenshtein)?
- Uso de GestureOverlayView o algo similar dentro de un Widget de Android
- Android TextView Linkify intercepta con el padre Ver gestos
- Deslizar hacia la izquierda, derecha, arriba y abajo dependiendo de la velocidad u otras variables
- ¿Existen bibliotecas de gestos de código abierto en Android?
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>
- Android: ¿cómo saber si MediaPlayer está pausado?
- AutoCompleteTextView muestra'android.database.sqlite.SQLiteCursor@'… después de hacer la selección