2011-01-10 12 views
7

Bir kullanıcının webView'de daha fazla gezinemediğini nasıl algılayacağımı bilmem gerekiyor. Ben kullanıcı sola veya sağa ucuz bira zaman bir eylem oluşturmak istediğiniz, ancak kullanıcının kaydırma edememesi durumunda:Android web görünümü: Kaydırma algılamasını saptama

IF the user swipes to the left AND the webview can't scroll to left THEN 
do something 
ELSE 
let the webview scroll 

cevap

11

Benim için çalışan bir çözüm buldum, 2.3 API'daki WebView sınıfının kaynak kodunu kontrol ediyorum ve bunu 2.1 API ile nasıl yapacağımı buluyorum. Ben bunun bu sorunu çözecektir düşünüyorum

public class CustomWebView extends WebView { 

    private float oldX; 

    // indicate if horizontal scrollbar can't go more to the left 
    private boolean overScrollLeft = false; 

    // indicate if horizontal scrollbar can't go more to the right 
    private boolean overScrollRight = false; 

    // indicate if horizontal scrollbar can't go more to the left OR right 
    private boolean isScrolling = false; 

    public CustomWebView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 


    public CustomWebView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     // TODO Auto-generated constructor stub 
    } 



    public CustomWebView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     // width of the vertical scrollbar 
     int scrollBarWidth = getVerticalScrollbarWidth(); 

     // width of the view depending of you set in the layout 
     int viewWidth = computeHorizontalScrollExtent(); 

     // width of the webpage depending of the zoom 
     int innerWidth = computeHorizontalScrollRange(); 

     // position of the left side of the horizontal scrollbar 
     int scrollBarLeftPos = computeHorizontalScrollOffset(); 

     // position of the right side of the horizontal scrollbar, the width of scroll is the width of view minus the width of vertical scrollbar 
     int scrollBarRightPos = scrollBarLeftPos + viewWidth - scrollBarWidth; 

     // if left pos of scroll bar is 0 left over scrolling is true 
     if(scrollBarLeftPos == 0) { 
      overScrollLeft = true; 
     } else { 
      overScrollLeft = false; 
     } 

     // if right pos of scroll bar is superior to webpage width: right over scrolling is true 
     if(scrollBarRightPos >= innerWidth) { 
      overScrollRight = true; 
     } else { 
      overScrollRight = false; 
     } 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: // when user touch the screen 
      // if scrollbar is the most left or right 
      if(overScrollLeft || overScrollRight) { 
       isScrolling = false; 
      } else { 
       isScrolling = true; 
      } 
      oldX = event.getX(); 
      break; 

     case MotionEvent.ACTION_UP: // when user stop to touch the screen 
      // if scrollbar can't go more to the left OR right 
      // this allow to force the user to do another gesture when he reach a side 
      if(!isScrolling) { 
       if(event.getX() > oldX && overScrollLeft) { 
        // left action 
       } 

       if(event.getX() < oldX && overScrollRight) { 
        // right actio 
       } 
      } 

      break; 
     default: 
      break; 
     } 
     return super.onTouchEvent(event); 
    } 

} 
+0

İçerik yakınlaştırıldığında veya uzaklaştırıldığında bu işe yaramıyor. Herhangi bir çözüm? – Chitrang

3

Orada API bazı ilginç yöntemlerdir, ancak bunlar korunur, bence sen Kendi Web Görünümünüzü oluşturabilir (WebView'i genişletebilir) ve bu yöntemleri kullanabilir ve bunları herkese açık hale getirebilir. Özellikle bu iki onScrollChanged ve onOverScroll'u kullanabilirsiniz.

+0

onOverScroll yöntemi android 2.3 için, yani 2.3 için Web görünümündeki kaynak kodunu almak ve içerecektir benim projemde. – Carbodrache

+0

Yararlı bilgi ve iyi şanslar – mdelolmo

0

: Belki eski API ile çalışabilecek

int horizontalOffset = computeHorizontalScrollOffset(); 
int contentWidth = (int) Math.floor(getContentWidth() * getScale()); 
int viewportWidth = getWidth(); 

// 1 just for random error 
boolean reachRightEnd = ((horizontalOffset + viewportWidth) >= (contentWidth - 1)); 
boolean reachLeftEnd = (horizontalOffset == 0);