Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 pinch zoom feature).

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

Tried to manually calculate the scale, with no luck (which feels complicated for this). Disable Double Tap Zoom/Unzoom on a webview

Android Webview - Webpage should fit the device screen

Is there a way to use the setUseWideViewPort and Zoomcontrolls but only disable or override the double tap zoom?

like image 299
jannej Avatar asked Apr 26 '12 09:04

jannej


2 Answers

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;
        }
    }
}
like image 196
iscariot Avatar answered Nov 02 '22 23:11

iscariot


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;
            }        
}
like image 44
jannej Avatar answered Nov 03 '22 00:11

jannej