2011-01-10 16 views
7

Potrzebuję wiedzieć, jak wykryć, czy użytkownik nie może już przewijać w widoku sieciowym. Chcę, aby wygenerować akcję, gdy użytkownik przeciąga się w lewo lub w prawo, ale tylko wtedy, gdy użytkownik nie może przewinąć:Przeglądarka internetowa Android: wykryj przewijanie

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

Odpowiedz

11

Znalazłem rozwiązanie, które działa dla mnie, sprawdzam kod źródłowy klasy WebView w 2.3 API i znajduję jak to zrobić z 2.1 API. Może ona pracować ze starszymi API:

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

Nie działa, gdy zawartość jest powiększana lub pomniejszana. Jakieś rozwiązanie? – Chitrang

3

Istnieje kilka ciekawych metody w API, ale są one chronione, myślę, że może stworzyć własny WebView (rozszerzyć WebView) i korzystać z tych metod i upublicznić je. konkretnie, może możesz użyć tych dwóch onScrollChanged i onOverScroll.

+0

metoda onOverScroll jest dla Android 2.3, więc będę się kod źródłowy WebView dla 2.3 i obejmują to w moim projekcie. – Carbodrache

+0

Dobrze wiedzieć! i powodzenia – mdelolmo

0

myślę, że to rozwiąże ten problem:

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); 
Powiązane problemy