2010-11-19 17 views
11

Mam kontrolę dostępu do stron internetowych, która musi obsługiwać gest rzucania w systemie Android, aby wyświetlić nowy rekord (załadować nowe dane). Dzieje się to w klasie, która rozszerza działanie. Wszystkie przykłady, które widziałem, pokazują, jak zaimplementować obsługę gestów dla tekstu, ale nic dla widoku internetowego.Gwałtowny gest i widok WWW w Androidzie

Potrzebuję wykonać różne akcje dla lewych i prawych rzutów. Jakakolwiek pomoc w kodzie byłaby doceniana, ponieważ to całkowicie mnie zaskoczyło.

Oto mój podstawowy onCreate i moja klasa

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() { 

.... 


} 

} 

Odpowiedz

11

Tworzenie GestureListener i GestureDetector. Wywołaj GestureDetector.onTouchEvent, przesuwając widok onTouchEvent przeglądarki.

Można również po prostu zastąpić działanie na onTouchEvent btw. Mogę opublikować kod, jeśli potrzebujesz.

Edytuj: Kod zgodnie z życzeniem.

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. Domyślam się, że domyślne zdarzenia dotykowe WebView mają na myśli, gdy wywołają kontrolki powiększenia itp.? Nie testowałem tego. Zauważyłem, że najskuteczniejsze jest wdrożenie własnego wykrywania gestów (nie jestem pewien, czy byłoby to najlepsze w przypadku WebView). Musisz spojrzeć na wydarzenie dotykowe jako trzy różne komponenty. Nacisk w dół, ruch (jeśli występuje) i komunikat prasowy, gdy naciśnięcie w dół, ruch, zwolnienie zawsze się zdarza.

Jeśli w folderze onDown wystąpi błąd "false", akcja powinna zostać przekazana do obsługi zdarzenia dotykowego WebView, ale program iirc zatrzymuje przekazywanie kolejnych zdarzeń do GestureDetector. Co jest w połowie powodem, dla którego zaimplementowałem własne, oparte na źródle Androida. iirc Dostałem pomysł z Poradników Sony Ericsson, które można pobrać z rynku. Jest to lista 3D, która pokazuje kod i jest łatwa do dostosowania.

+0

I próbowałem tej metody i wydaje się, że blokuje domyślne zdarzenia dotykowe WebView. Próbowałem również zaimplementować to w działaniu zamiast w WebView i również nie działało. Wyglądało na to, że problemem jest override onDown, ale ponieważ nie działa on bez tego, nie jestem pewien, jak to zrobić, nie zakłócając normalnych operacji WebView. Wszelkie sugestie dotyczące czegoś innego do wypróbowania? – cottonBallPaws

+1

@littleFluffyKitty. zobacz moją edycję mojej odpowiedzi. daj mi znać, jeśli mogę pomóc. – techiServices

+0

Zgadzam się z tym, że @littleFluffyKitty nadal - nawet po edycji wygląda na to, że ten kod dodaje możliwości rzutowania, ale wyłącza wszystkie domyślne zdarzenia dotykowe WebView, które w pewnym sensie pokonują cel. Interesuje mnie przewijanie i klikanie, którego nie powinienem przerabiać sam. – Han

2

@Han, wybaczcie @techiUsługi jego niesłuszna odpowiedź.

Problem z powyższym kodem polega na tym, że we wszystkich przypadkach zwraca on wartość true dla onFling i onDown. Zamiast tego zwracamy wartość false dla zdarzeń, których nie obsługujemy, lub dla warunków w tych zdarzeniach, których nie obsługujesz. Albo rzeczywiście, w onTouchEvent można przekazać wezwanie do klasy bazowej wracając

super.onTouchEvent(event); 
4

I uaktualniony kod, będzie to teraz pozwolić zadzwonić rodzime wydarzenia teleskopowe jeśli użytkownik nie flinged

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