Android WebView использует setWideViewPort, отключает масштабирование с двойным нажатием, но сохраняет фиксированный масштаб?

Я использую этот код, и он работает точно так, как я хочу. Но я должен реализовать еще одну функцию двойного нажатия и хотел бы отключить масштабирование двойного крана (но сохранить функцию масштабирования).

webView.getSettings().setLoadWithOverviewMode(true); webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setSupportZoom(true); webView.setInitialScale(1); 

Пытался вручную рассчитать масштаб, без везения (что для него сложно). Отключить двойное нажатие Zoom / Unzoom на веб-просмотре

Android Webview – веб-страница должна соответствовать экрану устройства

Есть ли способ использовать setUseWideViewPort и Zoomcontrolls, но отключить или переопределить двойное масштабирование?

Solutions Collecting From Web of "Android WebView использует setWideViewPort, отключает масштабирование с двойным нажатием, но сохраняет фиксированный масштаб?"

Лучшее решение, просто расширьте свой WebView из 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; } } } 

Найдено решение:

 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; } } 

Извините, у меня нет времени, чтобы проверить это, но попробуйте:

 GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { public boolean onDoubleTap(MotionEvent e) { showToast("Double tap"); return true; //instead of false } } 

Решение GestureDetector с «одним (первым) пальцем» не работает надежно. Веб-просмотр по-прежнему иногда увеличивается на Galaxy S3 Android 4.0.4. Дополнительный WebViewClient, подобный этому, можно использовать для восстановления масштаба масштабирования при увеличении вида:

 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); } } } }