2012-09-25 20 views
12

पर एक स्वाइप इशारा का पता लगाने के लिए कैसे मैं RelativeLayout और WebView के साथ एक साधारण एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं।वेबव्यू

मुझे स्क्रीन के बाएं हिस्से के 20% में केवल नीचे से ऊपर स्वाइप का पता लगाना है। तो जब उपयोगकर्ता उस स्थान पर नीचे से ऊपर तक स्वाइप करता है तो मुझे एक कस्टम संवाद दिखाना होगा।

क्या मैं कोशिश है:

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

लेकिन यह कुछ भी नहीं नहीं है! लेकिन कोई सफलता के साथ

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

} 

!!!:

तो मैं इस तरह से एक कस्टम वेबव्यू बनाने की कोशिश क्या कोई मेरी मदत कर सकता है?? धन्यवाद!!!!! :)

उत्तर

35

एक कस्टम वेब दृश्य के साथ एक GestureDetector का प्रयोग करें ..

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

इशारा डिटेक्टर:

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

कस्टम वेब दृश्य:

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

जैसा कहा गया है द्वारा Андрей Москвичёв:

इसे टच श्रोता: webview.setOnTouchListener(new OnTouchListener() ...) पंजीकृत करके वेबव्यू क्लास प्राप्त किए बिना हल किया जा सकता है और इससे gestureDetector.onTouchEvent(ev) पर कॉल किया जा सकता है।

+2

मेरे वेबव्यू में विधि सेट नहीं है GestureDetector ... मैं एंड्रॉइड 4.0 का उपयोग कर रहा हूं ... – JackTurky

+1

क्षमा करें कस्टम वेब व्यू जोड़ने के लिए भूल गया .. अब – Nermeen

+0

महान !!!! मैं नीचे से ऊपर (मुझे क्या चाहिए) को छोड़कर सभी को हटा दें और मैं देखता हूं कि अगर मैं webView.getScrollY()> = webView.getScale() * (webView.getContentHeight() - webView.getHeight() को छोड़ देता हूं अपवाद। लेकिन यह बहुत अच्छा काम करता है !!!!!!! क्या मैं मुझे बता सकता हूं कि स्क्रीन के केवल एक हिस्से पर उस इशारा को कैसे पहचानें? धन्यवाद! – JackTurky