2012-09-25 11 views
12

Zajmuję się tworzeniem prostej aplikacji Android z RelativeLayout i WebView wewnątrz.Jak wykrywać gest machnięcia na webview

Muszę wykrywać przesunięcie od dołu do góry wykonane tylko w 20% lewej części ekranu. Więc kiedy użytkownik przesuwa w tej przestrzeni od dołu do góry, muszę pokazać niestandardowe okno dialogowe.

Co próbuję to:

import android.app.Activity; 
import android.view.MotionEvent; 
import android.view.View; 

public class ActivitySwipeDetector implements View.OnTouchListener { 

    static final String logTag = "ActivitySwipeDetector"; 
    private Activity activity; 
    static final int MIN_DISTANCE = 100; 
    private float downY, upY; 

    public ActivitySwipeDetector(Activity activity){ 
     this.activity = activity; 
    } 

    public void onRightToLeftSwipe(){ 

    } 

    public void onLeftToRightSwipe(){ 

    } 

    public void onTopToBottomSwipe(){ 

    } 

    public void onBottomToTopSwipe(){ 
     System.out.println("BOTTOM TO TOP SWIPE DONE!"); 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getAction()){ 
     case MotionEvent.ACTION_DOWN: { 
      downY = event.getY(); 
      return true; 
     } 
     case MotionEvent.ACTION_UP: { 
      upY = event.getY(); 
      float deltaY = downY - upY; 
      if(Math.abs(deltaY) > MIN_DISTANCE){ 
       if(deltaY > 0) { this.onBottomToTopSwipe(); return true; } 
      } 
      else { 
       return false; 
      } 

      return true; 
     } 
     } 
     return false; 
    } 

} 

    layout = (RelativeLayout)this.findViewById(R.id.layout); 
    layout.setOnTouchListener(activitySwipeDetector); 

Ale to nie robi nic!

więc staram tworzenia niestandardowego webview w ten sposób:

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

public class MyWebView extends WebView { 
    public MyWebView(Context context) { 
     super(context); 
    } 
    public MyWebView(Context context,AttributeSet set){ 
     super(context,set); 
    } 



    @Override 
    public boolean onTouchEvent(MotionEvent evt) { 

     boolean consumed = super.onTouchEvent(evt); 
     if (isClickable()) { 
      switch (evt.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       lastTouchY = evt.getY(); 
       downTime = evt.getEventTime(); 
       hasMoved = false; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       hasMoved = moved(evt); 
       break; 
      case MotionEvent.ACTION_UP: 
       float actualTouchY = evt.getY(); 
       long currentTime = evt.getEventTime(); 
       float difference = Math.abs(lastTouchY - actualTouchY); 
       long time = currentTime - downTime; 

       if ((lastTouchY < actualTouchY) && (time < 220) && (difference > 100)) { 
        System.out.println("SWIPE1"); 
       } 
       if ((lastTouchY > actualTouchY) && (time < 220) && (difference > 100)) { 
        System.out.println("SWIPE2"); 
       } 
       break; 
      } 
     } 
     return consumed || isClickable(); 
    } 
    long downTime; 
    private float lastTouchY; 
    private boolean hasMoved = false; 
    private boolean moved(MotionEvent evt) { 
     return hasMoved || 
       Math.abs(evt.getY() - lastTouchY) > 10.0; 
    } 

} 

ale bez powodzenia !!! Czy ktoś może mi pomóc? Dzięki!!!!! :)

Odpowiedz

35

Użyj GestureDetector z widokiem na zlecenie internetowej ..

webView.setGestureDetector(new GestureDetector(new CustomeGestureDetector())); 

detektor gest:

private class CustomeGestureDetector extends SimpleOnGestureListener {  
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     if(e1 == null || e2 == null) return false; 
     if(e1.getPointerCount() > 1 || e2.getPointerCount() > 1) return false; 
     else { 
      try { // right to left swipe .. go to next page 
       if(e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 800) { 
        //do your stuff 
        return true; 
       } //left to right swipe .. go to prev page 
       else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 800) { 
        //do your stuff 
        return true; 
       } //bottom to top, go to next document 
       else if(e1.getY() - e2.getY() > 100 && Math.abs(velocityY) > 800 
         && webView.getScrollY() >= webView.getScale() * (webView.getContentHeight() - webView.getHeight())) { 
        //do your stuff 
        return true; 
       } //top to bottom, go to prev document 
       else if (e2.getY() - e1.getY() > 100 && Math.abs(velocityY) > 800) { 
        //do your stuff 
        return true; 
       } 
      } catch (Exception e) { // nothing 
      } 
      return false; 
     } 
    } 
} 

Widok niestandardowy internetowej:

public final class CustomWebView extends WebView { 

private GestureDetector gestureDetector; 

/** 
* @param context 
* @param attrs 
* @param defStyle 
*/ 
public CustomWebView(Context context) { 
    super(context); 
} 

/** 
* @param context 
* @param attrs 
* @param defStyle 
*/ 
public CustomWebView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

/** 
* @param context 
* @param attrs 
* @param defStyle 
*/ 
public CustomWebView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

/* 
* @see android.webkit.WebView#onScrollChanged(int, int, int, int) 
*/ 
@Override 
protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
    super.onScrollChanged(l, t, oldl, oldt); 
} 

/* 
* @see android.webkit.WebView#onTouchEvent(android.view.MotionEvent) 
*/ 
@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    return gestureDetector.onTouchEvent(ev) || super.onTouchEvent(ev); 
} 

public void setGestureDetector(GestureDetector gestureDetector) { 
    this.gestureDetector = gestureDetector; 
} 
} 

Jak zostało powiedziane autor: Андрей Москвичёв:

Można go rozwiązać bez wyprowadzania klasy WebView, rejestrując słuchacza dotykowego: webview.setOnTouchListener(new OnTouchListener() ...) i dzwoniąc pod numer gestureDetector.onTouchEvent(ev).

+2

Moja webview nie ma metody setGestureDetector ... Używam Androida 4.0 ... – JackTurky

+1

Niestety zapomniałem dodać niestandardowy widok WWW. Teraz już – Nermeen

+0

super !!!! Usuwam wszystko z wyjątkiem tego, jeśli od dołu do góry (to, czego potrzebuję) i widzę, że jeśli zostawię webView.getScrollY()> = webView.getScale() * (webView.getContentHeight() - webView.getHeight() to da mi wyjątek, ale działa świetnie !!!!!!! Czy mogę powiedzieć, jak rozpoznać ten gest tylko na części ekranu? dzięki! – JackTurky