【问题标题】:Android WebView use setWideViewPort, disable double-tap zoom but keep pinch zoom?Android WebView 使用 setWideViewPort,禁用双击缩放但保持捏缩放?
【发布时间】:2012-05-07 00:01:57
【问题描述】:

我正在使用此代码,它完全按照我的意愿工作。但是我必须在双击时实现另一个功能,并且想禁用双击缩放(但保留捏缩放功能)。

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

尝试手动计算比例,但没有成功(这感觉很复杂)。 Disable Double Tap Zoom/Unzoom on a webview

Android Webview - Webpage should fit the device screen

有没有办法使用 setUseWideViewPort 和 Zoomcontrolls 但只能禁用或覆盖双击缩放?

【问题讨论】:

  • 能否添加代码来覆盖双击事件?
  • 我正在使用 MyWebView 扩展 WebView。公共 MyWebView(FriarBook 上下文){ 超级(上下文); gd = new GestureDetector(context, sogl); } GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { public boolean onDoubleTap(MotionEvent e) { showToast("双击");返回假; } ...有点像我是 Android 和 Java 的新手... onDoubleTap 会触发,但不会覆盖双击缩放。

标签: android android-webview


【解决方案1】:

最佳解决方案,只需从 MyWebView 扩展您的 WebView

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

【讨论】:

    【解决方案2】:

    找到解决办法:

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

    【讨论】:

      【解决方案3】:

      抱歉,我没有时间测试这个,但请尝试:

      GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() {
          public boolean onDoubleTap(MotionEvent e) {
              showToast("Double tap");
              return true; //instead of false
          }
      }
      

      【讨论】:

      • 感谢您的输入,但我的返回值已经过期,它似乎没有任何区别。奇怪。
      【解决方案4】:

      带有“一个(第一)手指”解决方案的 GestureDetector 无法可靠地工作。在 Galaxy S3 Android 4.0.4 上,Web 视图有时仍会放大。像这样的附加 WebViewClient 可用于在视图缩放时恢复缩放比例:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-25
        • 1970-01-01
        • 2011-06-28
        • 2014-01-23
        • 1970-01-01
        • 2022-08-12
        • 2011-11-18
        • 1970-01-01
        相关资源
        最近更新 更多