2011-01-10 15 views
7

Ich muss wissen, wie man erkennt, wenn der Benutzer nicht mehr in einem WebView scrollen kann. Ich möchte eine Aktion erzeugen, wenn der Benutzer auf der linken oder rechten Seitenhiebe, aber nur, wenn der Benutzer kann nicht blättern:Android-Webansicht: erkennen scroll

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

Antwort

11

Ich fand eine Lösung, die für mich funktioniert, ich überprüfe den Quellcode der Klasse WebView in 2.3 API und finde, wie man es mit einer 2.1 API macht. Vielleicht kann es mit älteren API arbeiten:

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

Dies funktioniert nicht, wenn Inhalt vergrößert oder verkleinert wird. Irgendeine Lösungsmöglichkeit? – Chitrang

3

Es gibt einige interessante Methoden in der API, aber sie geschützt sind, ich glaube, Sie kann ein eigenes WebView erstellen (WebView erweitern) und diese Methoden verwenden und öffentlich machen. speziell, vielleicht können Sie diese beiden onScrollChanged und onOverScroll verwenden.

+0

die onOverScroll Methode für Android 2.3, also werde ich den Quellcode von Webansicht für 2,3 erhalten und umfassen es in meinem Projekt. – Carbodrache

+0

Gut zu wissen! und viel Glück – mdelolmo

0

ich denke, das dieses Problem lösen: ist

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