2013-05-09 5 views
10

ich die Geste in Android auf Android-Entwickler zu lesen, und nach dem Tutorial Ich habe versucht, die folgenden Codes auszuführen:Der GestureDetector funktioniert nicht (Beispiel aus dem Android-Entwickler)

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; 
    } 
} 

Die Codes kamen von der Website here.

Aber wenn ich die App lief, habe ich keine Information debug, wenn ich lange drücken klicken oder die Ansicht.

BTW, teste ich die Anwendung sowohl in der Emulator und HTC e1 Gerät.

Was ist das Problem?

+0

Warum meine Post schließen? – hguser

+0

Ich bin dankbar für die Eins, die meinen Beitrag erneuert hat. Vielen Dank. – hguser

+1

Google hatte nie eine starke, zuverlässige Dokumentation. Sie haben immer einen Beispielcode, der nie funktioniert/falsch/fehlerhaft. Sie müssen Websites wie diese besuchen, um zu überprüfen, ob ihre Stichprobe korrekt ist. –

Antwort

7

Sie sind eine GestureDetector zu schaffen, sondern Sie sind nie auf Ihre View „it up Einhaken“. Versuchen Sie, Ihre onCreate wie folgt zu ändern:

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); 
    } 
}); 
+0

Aber ich habe das 'OnTouch' Event für die Activity überschrieben. Ist es nicht genug? – hguser

+1

Ich denke, müssen Sie außer Kraft setzen 'dispatchTouchEvent (Motion me)' statt 'onTouchEvent()', wenn Sie es ohne einen Hörer auf die Ansicht selbst tun wollen. – FoamyGuy

+0

Dieser arbeitete für mich, wenn ich @Override dispatchTouchEvent statt onTouchEvent. – xpagesbeast

0

ich Ihre erste Zeile bearbeitet:

public class MainActivity extends Activity implements OnGestureListener, OnDoubleTapListener { 

verwendete ich Ihren Code aber lieferte die vollständige Schnittstelle Namen wie so:

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

Das funktionierte nach den Änderungen. Hoffe das hilft.

+1

Wenn ich dies versuchte, ist der "GestureDetector" rot unterstrichen, Fehler in Eclipse. Fehlermeldung "GestureDetector kann nicht in einen Typ aufgelöst werden" – xpagesbeast

4

wenig spät, aber meine Lösung für dieses Problem ist:

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

Die Rückkehr des Detektors verloren gegangen. ändern:

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

Aber ist dies eine gute Lösung? Zeit für Android Insider. ;)

Tschau Fred

0

ist hier einfach Android-Code für Geste Richtungserkennung:

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>