2012-09-25 29 views
12

Tôi đang phát triển một ứng dụng Android đơn giản với một số RelativeLayout và một bên là WebView.Cách phát hiện cử chỉ vuốt trên chế độ xem web

Tôi phải phát hiện swipe từ dưới lên trên chỉ được thực hiện trong 20% ​​phần bên trái của màn hình. Vì vậy, khi người dùng vuốt trong không gian đó từ dưới lên trên, tôi phải hiển thị hộp thoại tùy chỉnh.

gì tôi cố gắng là:

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

Nhưng nó không làm gì cả!

Vì vậy, tôi cố gắng tạo ra một webview tùy chỉnh theo cách này:

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

} 

nhưng không thành công !!! Ai đó có thể giúp tôi?? Cảm ơn!!!!! :)

Trả lời

35

Sử dụng một GestureDetector với một cái nhìn web tùy chỉnh ..

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

dò cử chỉ:

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

Quan điểm web tùy chỉnh:

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

Như đã nói bởi Андрей Москвичёв:

Nó có thể được giải quyết mà không có lớp WebView, bằng cách đăng ký người nghe cảm ứng: webview.setOnTouchListener(new OnTouchListener() ...) và gọi gestureDetector.onTouchEvent(ev) từ nó.

+2

chế độ xem web của tôi không có phương thức setGestureDetector ... Tôi đang sử dụng Android 4.0 ... – JackTurky

+1

xin lỗi đã quên thêm chế độ xem web tùy chỉnh..bây giờ – Nermeen

+0

tuyệt vời !!!! tôi loại bỏ tất cả ngoại trừ nếu dưới cùng của đầu trang (những gì tôi cần) và tôi thấy rằng nếu tôi rời khỏi webView.getScrollY()> = webView.getScale() * (webView.getContentHeight() - webView.getHeight() nó cho tôi ngoại trừ nó hoạt động tuyệt vời !!!!!!! tôi có thể cho tôi biết làm thế nào để nhận ra rằng cử chỉ chỉ trên một phần của màn hình? cảm ơn! – JackTurky

Các vấn đề liên quan