【问题标题】:How to disable doubletap zoom in android webview?如何在android webview中禁用双击缩放?
【发布时间】:2014-01-23 23:21:16
【问题描述】:

如何在 android webview 中禁用双击缩放。我尝试了很多东西,但没有奏效。请建议我实现这一目标的正确解决方案。

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

我已经尝试了以下方法,

webview.getSettings().setSupportZoom(false);

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

我尝试使用GestureDetector.SimpleOnGestureListener

请让我知道我必须在 onDoubleTap 中缩放任何内容。

【问题讨论】:

    标签: android webview scale gesture zooming


    【解决方案1】:

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

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

    【讨论】:

    • 嗨 .. 我想在 webview 中禁用双击和捏缩放。我以前见过,但运气不好。
    • wv.getSettings().setSupportZoom(false);此代码禁用 webview 中的捏缩放。 webView.getSettings().setUseWideViewPort(false);此代码可能会禁用(不确定)webview 中的双重缩放。对于双击缩放,StackOverflow 上有很多问题。请扩大您的搜索范围。
    【解决方案2】:

    在对 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】:

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

      【讨论】:

      • 这是如何工作的?好像你在模拟另一个水龙头,对吗?
      • 没错。它取消所有可能的双击等,并用单击替换它们。
      【解决方案4】:

      经过大量研究,我合并了一些无法单独使用的答案,并意识到它们对我来说非常有效。

      这将禁用 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”是行不通的。

      • 需要在可见性为“可见”或“不可见”时调用它。

      【讨论】:

        猜你喜欢
        • 2012-05-07
        • 2022-08-12
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        相关资源
        最近更新 更多