如何在android webview中禁用doubletap zoom?

时间:2014-01-06 14:19:49

标签: android webview scale gesture zooming

如何禁用android webview中的doubletap zoom。我尝试了很多东西,但它没有奏效。请建议我找到正确的解决方案。

实际上我正在从自定义html加载图像。我必须禁用完全缩放。

我尝试过以下的事情,

webview.getSettings().setSupportZoom(false);

甚至我在html中保留了元标记,并将其设为userscalable= no。即使它对我没用。

我尝试使用GestureDetector.SimpleOnGestureListener

请告诉我,我必须在onDoubleTap缩放任何内容。

4 个答案:

答案 0 :(得分:2)

Override onTouchEvent中的WebView 它适用于所有情况。

@Override
public boolean onTouchEvent( MotionEvent event ) {

    if (event.getAction() == MotionEvent.ACTION_UP) {

        event.setAction(MotionEvent.ACTION_CANCEL);
        super.onTouchEvent(event);
        event.setAction(MotionEvent.ACTION_DOWN);
        super.onTouchEvent(event);
        event.setAction(MotionEvent.ACTION_UP);
    }

return super.onTouchEvent(event);
}

答案 1 :(得分:1)

您是否检查过以下问题?请检查,这可能与您的问题有关。

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

答案 2 :(得分:1)

经过大量的试验和错误以及对SO的研究后,我提出了以下适用于我的应用的解决方案。

public class HelpWebView extends WebView {

    private GestureDetector gestureDetector;
    private AtomicBoolean mPreventAction = new AtomicBoolean(false);

    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()){
                mPreventAction.set(false);
                return true;
            }

            return super.onTouchEvent(event);
        } else {
            return true;
        }
    }

    private class GestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            mPreventAction.set(true);
            return true;
        }
        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            mPreventAction.set(true);
            return true;
        }
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            // onSingleTapConfirmed will only be called after the detector is confident
            // that the user's first tap is not followed by a second tap leading to a double-tap gesture
            return false; // it doesn't matter for the return value here as we only check mPreventAction above
        }
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            mPreventAction.set(true); // this is the key! this would block double tap to zoom to fire
            return false;
        }
    }
}

我参考了以下SO答案: https://stackoverflow.com/a/14724407/510577 https://stackoverflow.com/a/15547887/510577

答案 3 :(得分:1)

经过大量的研究,我合并了一些没有单独工作的答案,并意识到这对我来说很有效。

这会禁用WebView中的双击缩放。

首先,您需要在WebView中设置它:

YourWebView.getSettings().setUseWideViewPort(false);

然后,您需要扩展WebView。但首先需要获得比例值:

private int GetWebViewScale(){
    int WebViewWidth = YourWebView.getWidth();
    Double WebViewScale = new Double(WebViewWidth)/new Double(YourWebWidth); //Here, you must change YourWebWidth with your web width (in pixels)
    WebViewScale = WebViewScale * 100d;
    return WebViewScale.intValue();
}

现在您可以通过以下方式获取比例值:

YourWebView.setInitialScale(GetWebViewScale());

但是,如果你过早地启动代码它将无法工作,所以你将把这些代码放在WebViewClient的onLayoutChange覆盖中,如下所示:

YourWebView.addOnLayoutChangeListener(new View.OnLayoutChangeListener(){
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        YourWebView.setInitialScale(getScale());
    }
});

注意:您可能会遇到问题:(两件事都发生在我身上)

  • WebView水平移动一点。 (#1)
  • WebView没有缩放。 (#2)

修复问题#1:

  • 只需在“YourWebWidth”值中添加一些像素即可。例如:

在:

Double WebViewScale = new Double(WebViewWidth)/new Double(500); //(500 is my web's width)

后:

Double WebViewScale = new Double(WebViewWidth)/new Double(505); //(500+5) - (This will add some padding at the left and right of your WebView. 2,5px at the left side; 2,5 at the right side)

修复问题#2

  • 可能你的WebView的可见性已经“消失”,当它出现时,它没有宽度。所以调用“GetWebViewScale”将无效。

  • 当其可见性“可见”或“不可见”时,您需要调用它。