Vista web de Android: evita que los gestos táctiles se pasen a la vista principal de los padres
Tengo un viewpager que contiene muchas vistas del niño; Cada vista secundaria es una vista web. Cada webview tiene algunos objetos HTML con los que el usuario puede interactuar; Por ejemplo, una presentación de diapositivas que funciona en gestos de desplazamiento o un círculo arrastrable que el usuario puede mover alrededor del lienzo HTML.
El problema es cuando el usuario realiza un gesto en estos objetos HTML, el viewpager se desplaza a la siguiente vista. Quiero que los objetos HTML funcionen cuando el usuario interactúa con ellos (viewpager no se desplaza) y el viewpager para desplazarse cuando el usuario desliza en otro lugar. ¿Cómo puedo hacer eso?
- ¿Es posible cambiar el navegador / motor predeterminado para la vista Web de Android?
- WebView deshacerse de doble toque zoom.
- El banner de instalación de la aplicación no funciona
- Asegurar las APIs de webservice RESTful de Spring de acceso no autorizado?
- Reproducción de un video local de aplicación (.mp4) en una vista web
PS He utilizado event.preventDefault()
y event.stopPropagation()
en el JavaScript de la presentación de diapositivas de HTML con la esperanza de que la vista web no pasará eventos de contacto a padre viewpager.
- ¿Cómo enviar notificaciones a la aplicación de Android desde el servidor de Java mediante GCM?
- Cómo mostrar texto marathi en Android procedente de webservice
- Phonegap Android Internet no funciona
- ¿Cómo obtener datos completos de cookies desde un WebView de Android?
- Tiempo de espera para solicitud de servidor hecha usando "Volley" solo en Android no iOS
- No puedo conectarme a mi servicio web
- Envío de un archivo pdf al cliente desde el servidor a través del servicio web
- Cookies HTTP WebView HTTP no funcionan en la API 21
Anular el método "canScroll"
de su ViewPager
y permitir el desplazamiento sólo si la vista no es una instancia de WebView
.
Muestra:
public class MyViewPager extends ViewPager { public MyViewPager (Context context) { super(context); } public MyViewPager (Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { if(v instanceof WebView){ return true; } return super.canScroll(v, checkV, dx, x, y); } }
Mi idea era implementar una función Javascript que decide qué partes desplazar:
function checkScroll(x, y){ var o = document.elementFromPoint(x, y); result = $('div.swiper-container').find(o).length; MyAndroidInterface.processReturnValue(result); }
A continuación, anule estos dos métodos:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: homepage.callJavascript("checkScroll(" + Math.round(ev.getX()) + "," + Math.round(ev.getY()) + ")"); return super.onTouchEvent(ev); case MotionEvent.ACTION_MOVE: if (homepage.scrollSlideshowLock()) return false;
Cree su propia subclase de ViewPager y sobrescriba canScroll como sigue.
class MyViewPager extends ViewPager { ... @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { if (isInsideSlideShow(x,y)) { return true; // allow the slide show its own scrolling } else { return false; // ViewPager scrolls } }
Usted de alguna manera, por supuesto, necesita saber qué parte de la pantalla está cubierta por la presentación de diapositivas. Este conocimiento debe ser implementado en el método isInsideSlideShow.
Si no puede obtener las coordenadas x / y de la presentación de diapositivas, otra solución podría ser utilizar gestos que comiencen en el borde mismo de la vista como gestos de paginación y gestos que comienzan más en el área interior como gestos de presentación de diapositivas.
Estoy utilizando este enfoque para un paginador de vista que muestra un mapa y un gráfico. Ambos están apoyando su propia panorámica. Pero cuando el usuario inicia el gesto en el borde izquierdo o derecho, todo el mapa o gráfico se desliza:
@Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { int width = getWidth(); int slideWidth = Math.round(width * 0.15f); if (x < slideWidth || x > width - slideWidth) { return false; } return true; }