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.