如何在android webview中禁用双击缩放?

如何在android webview中禁用双击缩放?,android,webview,scale,gesture,zooming,Android,Webview,Scale,Gesture,Zooming,如何在androidwebview中禁用双击放大功能。我试过很多东西,但都没用。请向我建议实现这一目标的正确解决方案 实际上,我正在从自定义html加载一个图像。我必须为此禁用完全缩放 我试过下面的方法 webview.getSettings().setSupportZoom(false); 甚至我还在html中保留了meta标记,并将其设置为userscalable=no。即使它对我也不起作用 我试着使用gesturedector.SimpleOnGestureListener 请让我知道我

如何在android
webview
中禁用双击放大功能。我试过很多东西,但都没用。请向我建议实现这一目标的正确解决方案

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

我试过下面的方法

webview.getSettings().setSupportZoom(false);
甚至我还在html中保留了meta标记,并将其设置为
userscalable=no
。即使它对我也不起作用

我试着使用
gesturedector.SimpleOnGestureListener


请让我知道我必须在
onDoubleTap
中缩放任何对象

你检查过下面的问题了吗?请检查,这可能与您的问题有关


经过大量的尝试和研究,我提出了以下适用于我的应用程序的解决方案

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;
        }
    }
}
我参考了以下答案:
覆盖
您的
网络视图中的
onTouchEvent

它在所有情况下都有效

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

经过大量的研究,我把一些不能单独使用的答案合并在一起,并意识到一起使用对我来说是完美的

这将禁用网络视图中的双击缩放。

首先,您需要在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”将不起作用

  • 当它的可见性为“可见”或“不可见”时,需要调用它


Hii。。我想在webview中禁用双击和收缩缩放。我以前看到过,但不太幸运。wv.getSettings().setSupportZoom(false);此代码在webview中禁用收缩缩放。webView.getSettings().setUseWideViewPort(false);此代码可能会禁用(不确定)webview中的双重缩放。对于双击缩放,有很多关于堆栈溢出的问题。请展开搜索。这是如何工作的?好像你在模拟另一次敲击,对吗?没错。它取消了所有可能的双抽头等,并将其替换为单抽头。