2011-01-10 20 views
7

Necesito saber cómo detectar si el usuario ya no puede desplazarse en una vista web. Quiero generar una acción cuando el usuario pasa a la izquierda oa la derecha, pero sólo si el usuario no puede desplazarse:Vista web de Android: detectar desplazamiento

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

Respuesta

11

Encontré una solución que me funciona, compruebo el código fuente de la clase WebView en 2.3 API y encuentro cómo hacerlo con una API 2.1. Tal vez se puede trabajar con la API de más edad:

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

Esto no funciona cuando el contenido se acerca o aleja. ¿Alguna solución? – Chitrang

3

Hay algunos métodos interesantes de la API, pero que están protegidos, creo que se puede crear su propio WebView (extender WebView) y usar esos métodos y hacerlos públicos. específicamente, tal vez usted puede usar estos dos onScrollChanged y onOverScroll.

+0

el método onOverScroll es de Android 2.3, por lo que obtendrá el código fuente de vistas web de 2.3 e incluyen en mi proyecto – Carbodrache

+0

¡Es bueno saberlo! y buena suerte – mdelolmo

0

Creo que esto va a resolver este problema:

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