android scroll android-webview android-viewpager

android - Desplazarse por la vista web horizontalmente dentro de una ViewPager



scroll android-webview (2)

Puse un WebView cargando una imagen dentro de un ViewPager. Cuando trato de desplazar la imagen horizontalmente, me muevo hacia la siguiente vista en lugar de desplazar la imagen.

¿Es posible hacer que se desplace hasta el final de la imagen antes de pasar a la vista siguiente?

@Override public Object instantiateItem(View view, int i) { WebView webview = new WebView(view.getContext()); webview.setHorizontalScrollBarEnabled(true); webview.loadUrl("http://www.site.with.an/image.gif"); ((ViewPager) view).addView(webview, 0); return webview; }


Aunque Sven mencionó el archivo de diseño, quiero agregar detalles. Después de ampliar las clases Webview y ViewPager,

Dentro de tu actividad, lanzarás a tu clase extendida de esta manera:

web = (MyWebView) findViewById(R.id.webview);

Dentro de su archivo de diseño de esta manera:

<your.package.name.MyWebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" />


La siguiente es una solución de trabajo real que desplazará WebView en un deslizamiento horizontal siempre que pueda desplazarse. Si WebView no puede desplazarse más, ViewPager consumirá el siguiente deslizamiento horizontal para cambiar de página.

Extender la WebView

Con API-Level 14 (ICS), se ha introducido el método canScrollHorizontally() , que necesitamos para resolver el problema. Si desarrolla solo para ICS o superior, puede usar este método directamente y pasar a la siguiente sección. De lo contrario, tenemos que implementar este método por nuestra cuenta, para que la solución también funcione en pre-ICS.

Para hacerlo, simplemente obtenga su propia clase de WebView :

public class ExtendedWebView extends WebView { public ExtendedWebView(Context context) { super(context); } public ExtendedWebView(Context context, AttributeSet attrs) { super(context, attrs); } public boolean canScrollHor(int direction) { final int offset = computeHorizontalScrollOffset(); final int range = computeHorizontalScrollRange() - computeHorizontalScrollExtent(); if (range == 0) return false; if (direction < 0) { return offset > 0; } else { return offset < range - 1; } } }

Importante: Recuerde hacer referencia a su ExtendedWebView dentro de su archivo de diseño en lugar del WebView estándar.

Extender el ViewPager

Ahora necesita extender el ViewPager para manejar los ViewPager horizontales correctamente. Esto debe hacerse en cualquier caso, sin importar si está usando ICS o no:

public class WebViewPager extends ViewPager { public WebViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { if (v instanceof ExtendedWebView) { return ((ExtendedWebView) v).canScrollHor(-dx); } else { return super.canScroll(v, checkV, dx, x, y); } } }

Importante: recuerde hacer referencia a su WebViewPager dentro de su archivo de diseño en lugar del ViewPager estándar.

¡Eso es!

Actualización del 07/07/2012: Recientemente me di cuenta de que las cosas que se muestran arriba ya no son necesarias al usar la implementación "actual" de ViewPager . La implementación "actual" parece comprobar las canScroll correctamente antes de capturar el evento de desplazamiento por sí mismo (consulte el método ViewPager de ViewPager here ). No sé exactamente, cuando se modificó la implementación para manejar esto correctamente, todavía necesito el código anterior en Android Gingerbread (2.3.x) y anteriores.