Android WebView use setWideViewPort, disable double-tap zoom but keep pinch zoom?

前端 未结 4 1613
無奈伤痛
無奈伤痛 2021-02-03 14:51

I am using this code and it works exactly as I want. But I have to implemented another feature on double tap and would like to disable the double tap zooming (but keeping the pi

相关标签:
4条回答
  • 2021-02-03 14:59

    The GestureDetector with "one(first) finger" solution does not work reliably. The web view is still sometimes zoomed on Galaxy S3 Android 4.0.4. An additional WebViewClient like this can be used to restore the zoom scale when the view is zoomed:

    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);
                }
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-03 15:04

    best solution, just extend your WebView from 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;
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-03 15:11

    Found a solution:

    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;
                }        
    }
    
    0 讨论(0)
  • 2021-02-03 15:17

    Sorry, I don't have time to test this but try:

    GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() {
        public boolean onDoubleTap(MotionEvent e) {
            showToast("Double tap");
            return true; //instead of false
        }
    }
    
    0 讨论(0)
提交回复
热议问题