Cómo detectar un gesto de desplazamiento en la vista web

Estoy desarrollando una sencilla aplicación para Android con RelativeLayout y WebView dentro.

Tengo que detectar swipe de abajo hacia arriba hecho sólo en el 20% de la parte izquierda de la pantalla. Así que cuando el usuario deslizar en ese espacio de abajo a arriba tengo que mostrar un diálogo personalizado.

Lo que intento es:

 import android.app.Activity; import android.view.MotionEvent; import android.view.View; public class ActivitySwipeDetector implements View.OnTouchListener { static final String logTag = "ActivitySwipeDetector"; private Activity activity; static final int MIN_DISTANCE = 100; private float downY, upY; public ActivitySwipeDetector(Activity activity){ this.activity = activity; } public void onRightToLeftSwipe(){ } public void onLeftToRightSwipe(){ } public void onTopToBottomSwipe(){ } public void onBottomToTopSwipe(){ System.out.println("BOTTOM TO TOP SWIPE DONE!"); } public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: { downY = event.getY(); return true; } case MotionEvent.ACTION_UP: { upY = event.getY(); float deltaY = downY - upY; if(Math.abs(deltaY) > MIN_DISTANCE){ if(deltaY > 0) { this.onBottomToTopSwipe(); return true; } } else { return false; } return true; } } return false; } } layout = (RelativeLayout)this.findViewById(R.id.layout); layout.setOnTouchListener(activitySwipeDetector); 

¡Pero no hace nada!

Así que intento crear una webview personalizada de esta manera:

 import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.webkit.WebView; public class MyWebView extends WebView { public MyWebView(Context context) { super(context); } public MyWebView(Context context,AttributeSet set){ super(context,set); } @Override public boolean onTouchEvent(MotionEvent evt) { boolean consumed = super.onTouchEvent(evt); if (isClickable()) { switch (evt.getAction()) { case MotionEvent.ACTION_DOWN: lastTouchY = evt.getY(); downTime = evt.getEventTime(); hasMoved = false; break; case MotionEvent.ACTION_MOVE: hasMoved = moved(evt); break; case MotionEvent.ACTION_UP: float actualTouchY = evt.getY(); long currentTime = evt.getEventTime(); float difference = Math.abs(lastTouchY - actualTouchY); long time = currentTime - downTime; if ( (lastTouchY < actualTouchY) && (time < 220) && (difference > 100) ) { System.out.println("SWIPE1"); } if ( (lastTouchY > actualTouchY) && (time < 220) && (difference > 100) ) { System.out.println("SWIPE2"); } break; } } return consumed || isClickable(); } long downTime; private float lastTouchY; private boolean hasMoved = false; private boolean moved(MotionEvent evt) { return hasMoved || Math.abs(evt.getY() - lastTouchY) > 10.0; } } 

Pero sin éxito !!! ¿¿alguien me puede ayudar?? ¡¡¡¡¡Gracias!!!!! 🙂

Utilice un GestureDetector con una vista web personalizada.

 webView.setGestureDetector(new GestureDetector(new CustomeGestureDetector())); 

El detector de gestos:

 private class CustomeGestureDetector extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if(e1 == null || e2 == null) return false; if(e1.getPointerCount() > 1 || e2.getPointerCount() > 1) return false; else { try { // right to left swipe .. go to next page if(e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 800) { //do your stuff return true; } //left to right swipe .. go to prev page else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 800) { //do your stuff return true; } //bottom to top, go to next document else if(e1.getY() - e2.getY() > 100 && Math.abs(velocityY) > 800 && webView.getScrollY() >= webView.getScale() * (webView.getContentHeight() - webView.getHeight())) { //do your stuff return true; } //top to bottom, go to prev document else if (e2.getY() - e1.getY() > 100 && Math.abs(velocityY) > 800 ) { //do your stuff return true; } } catch (Exception e) { // nothing } return false; } } } 

La vista web personalizada:

 public final class CustomWebView extends WebView { private GestureDetector gestureDetector; /** * @param context * @param attrs * @param defStyle */ public CustomWebView(Context context) { super(context); } /** * @param context * @param attrs * @param defStyle */ public CustomWebView(Context context, AttributeSet attrs) { super(context, attrs); } /** * @param context * @param attrs * @param defStyle */ public CustomWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /* * @see android.webkit.WebView#onScrollChanged(int, int, int, int) */ @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); } /* * @see android.webkit.WebView#onTouchEvent(android.view.MotionEvent) */ @Override public boolean onTouchEvent(MotionEvent ev) { return gestureDetector.onTouchEvent(ev) || super.onTouchEvent(ev); } public void setGestureDetector(GestureDetector gestureDetector) { this.gestureDetector = gestureDetector; } } 

Como se ha dicho por Андрей Москвичёв:

Se puede resolver sin derivar la clase WebView, registrando el oyente táctil: webview.setOnTouchListener(new OnTouchListener() ...) y llamando a gestureDetector.onTouchEvent(ev) .

  • Conexión de cliente a servidor en aplicaciones de chat como Viber o Telegram
  • Dynamic "apple-touch-icon" en dispositivos Android?
  • Cambiar la selección de texto a rtl en lugar de predeterminar ltr
  • Android ViewPager + Webview, ClassCastException! Necesita una vista web en un viewpager
  • Ampliar / reducir en webview android
  • Llamar al servicio web WSDL mediante el uso de retrofit android
  • Vista web de Android en la mitad de la pantalla
  • ¿Cómo enviar notificaciones a la aplicación de Android desde el servidor de Java mediante GCM?
  • Cómo convertir HttpEntity en JSON?
  • ¿Cuál es la mejor práctica para compartir modelos entre un servidor API WEB y una aplicación cliente Android?
  • Cookies de Android para la dirección IP
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.