2010-11-19 8 views
11

Ich habe ein Webview-Steuerelement, das die Fling-Geste in Android unterstützen muss, um einen neuen Datensatz (neue Daten laden) zu erstellen. Dies geschieht in einer Klasse, die Aktivität erweitert. Alle Beispiele, die ich gesehen habe, zeigen, wie man die Gestenunterstützung für eine Textansicht implementiert, aber nichts für die Webansicht.Fling Geste und Webview in Android

Ich muss verschiedene Aktionen für beide linken und rechten Flings ausführen. Irgendwelche Code-Hilfe würde geschätzt werden, da dies mich völlig ratlos macht.

Hier ist meine Grund onCreate und meine Klasse

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.os.Bundle; 
import android.text.Html; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.Window; 

import android.webkit.WebView; 

public class ArticleActivity extends Activity { 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 



    Window w = getWindow(); 

    w.requestFeature(Window.FEATURE_LEFT_ICON); 

    WebView webview = new WebView(this); 
    setContentView(webview); 



    w.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, 
    R.drawable.gq); 




    setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); 
    populateFields(); 
    webview.loadData(question + answer, "text/html", "utf-8"); 



    // 
} 
private void populateFields() { 

.... 


} 

} 

Antwort

11

erstellen GestureListener und GestureDetector. Rufen Sie das GestureDetector.onTouchEvent auf, indem Sie das onTouchEvent der Webansicht überschreiben.

Sie können auch einfach die Aktivität onTouchEvent btw überschreiben. Ich kann Code schreiben, wenn Sie brauchen.

Bearbeiten: Code wie angefordert.

public class Main extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     MyWebView webview = new MyWebView(this); 
     setContentView(webview); 
    } 

    class MyWebView extends WebView { 
     Context context; 
     GestureDetector gd; 

     public MyWebView(Context context) { 
      super(context); 

      this.context = context; 
      gd = new GestureDetector(context, sogl); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      return gd.onTouchEvent(event); 
     } 

     GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { 
      public boolean onDown(MotionEvent event) { 
       return true; 
      } 

      public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { 
       if (event1.getRawX() > event2.getRawX()) { 
        show_toast("swipe left"); 
       } else { 
        show_toast("swipe right"); 
       } 
       return true; 
      } 
     }; 

     void show_toast(final String text) { 
      Toast t = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
      t.show(); 
     } 
    } 
} 

@littleFluffyKitty. Ich vermute standardmäßig WebView-Touch-Events, die Sie meinen, wenn es die Zoom-Steuerelemente usw. aufruft? Das habe ich nicht getestet. Ich habe festgestellt, dass das Implementieren der eigenen Gestenerkennung am besten funktioniert (nicht sicher, ob es am besten in einem WebView funktioniert). Sie müssen ein Berührungsereignis als drei verschiedene Komponenten betrachten. Das Herunterdrücken, die Bewegung (wenn überhaupt) und die Pressemitteilung, wie das Herunterdrücken, Bewegen, Loslassen immer passieren.

Wenn Sie in onDown eine Rückgabe false ausführen, sollte die Aktion an den WebView touch -Ereignishandler übergeben werden, aber sie stoppt die nachfolgenden Ereignisse, die an den GestureDetector übergeben werden. Was ist die Hälfte der Grund, warum ich meine eigene, die auf der Android-Quelle basiert implementieren. Ich habe die Idee von den Sony Ericsson Tutorials, die vom Markt herunterladbar sind. Es ist die 3D-Liste, die den Code zeigt und sehr einfach anzupassen ist.

+0

I habe diese Methode ausprobiert und scheint die Standard-WebView-Touch-Ereignisse zu blockieren. Ich habe auch versucht, dies auf der Activity anstelle von WebView zu implementieren und es hat auch nicht funktioniert. Es scheint, als wäre die Überschreibung auf dem onDown das Problem, aber da es scheinbar nicht funktioniert, bin ich mir nicht sicher, wie ich das zum Laufen bringen kann, ohne den normalen Betrieb des WebView zu stören. Irgendwelche Vorschläge von etwas anderem zu versuchen? – cottonBallPaws

+1

@littleFluffyKitty. Bitte sehen Sie meine Bearbeitung auf meiner Antwort. lass mich wissen, ob ich dir mehr helfen kann. – techiServices

+0

Ich stimme @littleFluffyKitty immer noch zu - auch nach dem Editieren sieht dieser Code die Fling-Fähigkeiten aus, aber deaktiviert alle Standard-WebView-Touch-Ereignisse, die den Zweck vereiteln. Die, an denen ich interessiert bin, sind scroll and click, was ich nicht neu schreiben sollte. – Han

2

@Han, verzeihen Sie @techiServices seine unangemeldete Antwort.

Das Problem mit dem obigen Code ist, dass in allen Fällen für OnFling und OnDown True zurückgegeben wird. Stattdessen möchten Sie für die Ereignisse, die Sie nicht behandeln, oder für Bedingungen in den Ereignissen, die Sie nicht behandeln, false zurückgeben. Oder in der Tat, in onTouchEvent können Sie den Aufruf der Basisklasse vorbei

Rückkehr
super.onTouchEvent(event); 
4

ich den Code aktualisiert, wird dies nun ermöglichen nativen Ereignisse Handler aufrufen, wenn der Benutzer nicht geschleuderte hat

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.webkit.WebView; 

public class MyWebView extends WebView { 
    private boolean flinged; 

    private static final int SWIPE_MIN_DISTANCE = 320; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

    public MyWebView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     gd = new GestureDetector(context, sogl); 
    } 

    GestureDetector gd; 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     gd.onTouchEvent(event); 
     if (flinged) { 
      flinged = false; 
      return true; 
     } else { 
      return super.onTouchEvent(event); 
     } 
    } 

    GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { 
    // your fling code here 
     public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { 
      if (event1.getX() < 1200 && event1.getX() > 80) { 
       return false; 
      } 
      if (Math.abs(event1.getY() - event1.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      if(event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       loadUrl("javascript:changePage('LEFT')"); 
       Log.i("Swiped","swipe left"); 
       flinged = true; 
      } else if (event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       loadUrl("javascript:changePage('RIGHT')"); 
       Log.i("Swiped","swipe right"); 
       flinged = true; 
      } 
      return true; 
     } 
    }; 
}