Android WebView use setWideViewPort, deshabilitar doble toque zoom pero mantener pellizcar zoom?
Estoy utilizando este código y funciona exactamente como yo quiero. Pero tengo que implementar otra característica en doble toque y desea desactivar el zoom de doble toque (pero manteniendo la función de zoom pellizcar).
webView.getSettings().setLoadWithOverviewMode(true); webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setSupportZoom(true); webView.setInitialScale(1);
Trató de calcular manualmente la escala, sin suerte (que se siente complicado para esto). Deshabilitar doble toque en Zoom / Unzoom en una vista web
- La ventana de Android no cambia de tamaño / panorámica cuando se abre softinput desde WebView
- OnPageFinished está disparando antes de cargar la página
- La vista web de Android no cargará mi URL pero cargará otros
- Obtener código de estado HTTP en Android WebView
- Para mostrar una página html estática en android
Vista Web de Android: la página web debe ajustarse a la pantalla del dispositivo
¿Hay una manera de utilizar el setUseWideViewPort y Zoomcontrolls pero sólo desactivar o anular el zoom de doble toque?
- Webview guardar el problema de rotación de contraseña
- Una gran cantidad de NPE de DeviceMotionService suceder recientemente
- Inicia sesión de Google en la aplicación sin agregarla a las cuentas de dispositivos
- Android M Preview 3 emulador Native Browser crash
- ¿Cómo evitar la recreación de fragmentos cuando se selecciona de NavigationDrawer?
- ¿Qué significa "bloquear todas las solicitudes de carga de red"?
- Habilitar teclado de correo electrónico en android para el tipo de entrada de correo electrónico
- No puedo conseguir que vine.co se cargue en un WebView, no importa lo que envíe el useragent.
Mejor solución, simplemente extienda su WebView desde MyWebView
public class HelpWebView extends WebView { private GestureDetector gestureDetector; private AtomicBoolean mPreventAction = new AtomicBoolean(false); private AtomicLong mPreventActionTime = new AtomicLong(0); public HelpWebView(Context context) { super(context); gestureDetector = new GestureDetector(context, new GestureListener()); } public HelpWebView(Context context, AttributeSet attrs) { super(context, attrs); gestureDetector = new GestureDetector(context, new GestureListener()); } public HelpWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); gestureDetector = new GestureDetector(context, new GestureListener()); } public HelpWebView(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) { super(context, attrs, defStyle, privateBrowsing); gestureDetector = new GestureDetector(context, new GestureListener()); } @Override public boolean onTouchEvent(MotionEvent event) { int index = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; int pointId = event.getPointerId(index); // just use one(first) finger, prevent double tap with two and more fingers if (pointId == 0){ gestureDetector.onTouchEvent(event); if (mPreventAction.get()){ if (System.currentTimeMillis() - mPreventActionTime.get() > ViewConfiguration.getDoubleTapTimeout()){ mPreventAction.set(false); } else { return true; } } return super.onTouchEvent(event); } else { return true; } } private class GestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDoubleTap(MotionEvent e) { mPreventAction.set(true); mPreventActionTime.set(System.currentTimeMillis()); return true; } @Override public boolean onDoubleTapEvent(MotionEvent e) { mPreventAction.set(true); mPreventActionTime.set(System.currentTimeMillis()); return true; } } }
Encontré una solución:
class MyWebView extends WebView { public boolean onTouchEvent(MotionEvent event) { gd.onTouchEvent(event); // disable double tap zooming if(doubleTap) { doubleTap = false; return false; } return super.onTouchEvent(event); } GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { public boolean onDoubleTap(MotionEvent e) { showToast("Double tap"); doubleTap = true; return false; } }
Lo siento, no tengo tiempo para probar esto pero pruebe:
GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { public boolean onDoubleTap(MotionEvent e) { showToast("Double tap"); return true; //instead of false } }
El GestureDetector con "una (primer) dedo" solución no funciona de forma fiable. La vista web sigue siendo a veces ampliada en Galaxy S3 Android 4.0.4. Un WebViewClient adicional como este se puede utilizar para restaurar la escala de zoom cuando se amplía la vista:
public class NoZoomedWebViewClient extends WebViewClient { private static final String LOG_TAG = "NoZoomedWebViewClient"; private static final long STABLE_SCALE_CALCULATION_DURATION = 2 * 1000; private long stableScaleCalculationStart; private String stableScale; // Avoid comparing floats private long restoringScaleStart; NoZoomedWebViewClient() { stableScaleCalculationStart = System.currentTimeMillis(); } @Override public void onScaleChanged(final WebView view, float oldScale, float newScale) { Log.d(LOG_TAG, "onScaleChanged: " + oldScale + " -> " + newScale); long now = System.currentTimeMillis(); boolean calculating = (now - stableScaleCalculationStart) < STABLE_SCALE_CALCULATION_DURATION; if (calculating) { stableScale = "" + newScale; } else if (!stableScale.equals("" + newScale)) { boolean zooming = (now - restoringScaleStart) < STABLE_SCALE_CALCULATION_DURATION; if (!zooming) { Log.d(LOG_TAG, "Zoom out to stableScale: " + stableScale); restoringScaleStart = now; view.zoomOut(); // Just to make sure, do it one more time view.postDelayed(new Runnable() { @Override public void run() { view.zoomOut(); } }, STABLE_SCALE_CALCULATION_DURATION); } } } }
- No puedo ver el progreso de spinner en ProgressDialog en Lollipop
- Cómo corregir "Evitar pasar null como la raíz de la vista" en android?