2012-04-26 103 views
6

我正在使用此代码,它的工作原理与我想要的完全一样。但我必须在双击上实现另一个功能,并希望禁用双击缩放(但保留缩放缩放功能)。Android WebView使用setWideViewPort,禁用双击缩放但保持缩放?

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但只有禁用或覆盖到双击缩放的方式?

+0

您可以添加代码以覆盖doubletap事件吗? – Ferdau 2012-04-26 09:15:26

+0

我正在用MyWebView扩展WebView。公共MyWebView(FriarBook上下文){超级上下文} {超级上下文} {超级上下文} \t gd = new GestureDetector(context,sogl); \t \t } GestureDetector.SimpleOnGestureListener sogl =新GestureDetector.SimpleOnGestureListener(){公共布尔onDoubleTap(MotionEvent E){ \t \t \t \t \t \t \t \t showToast( “双击”); \t \t \t \t \t \t \t \t \t \t \t \t \t \t返回FALSE; \t \t \t \t \t \t \t} ...那种我在的Android和Java ...的onDoubleTap火灾是一个新手,但不是首要双击缩放。 – jannej 2012-04-26 09:46:15

+0

为何选择投票? – jannej 2012-10-05 09:36:21

回答

12

最佳的解决方案,刚刚从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; 
     } 
    } 
} 
扩展您的WebView
1

对不起,我没有时间来测试这一点,但尝试:

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

感谢您的输入,但我用返回值expire,它似乎没有任何区别。奇怪。 – jannej 2012-04-26 11:14:24

3

找到了解决办法:

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

带有“一根(第一根)手指”解决方案的手势检测器无法可靠工作。 Galaxy S3 Android 4.0.4上的网页视图有时会缩小。当放大视图时,可以使用像这样的附加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); 
      } 
     } 
    } 
}