Android WebView如何使用setWideViewPort,禁用双击缩放但保留捏合缩放?

6

我正在使用这段代码,它完全符合我的要求。但是我想在双击时实现另一个功能,并希望禁用双击缩放(但保留捏合缩放功能)。

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

尝试手动计算比例,但没有成功(对于这个来说感觉很复杂)。 禁用WebView上的双击缩放/取消缩放

Android WebView - 网页应适应设备屏幕

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


你能添加覆盖双击事件的代码吗? - Ferdau
我正在使用MyWebView扩展WebView。public MyWebView(FriarBook context){ super(context); gd = new GestureDetector(context,sogl); } GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener(){ public boolean onDoubleTap(MotionEvent e){showToast(“双击”);return false;} ……我是Android和Java的新手……onDoubleTap触发了,但没有覆盖双击缩放。 - jannej
4个回答

12

最佳解决方案:只需从 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;
        }
    }
}

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

抱歉,我没有时间测试这个,但是可以试试看:

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

谢谢您的建议,但我已经尝试了返回值,似乎没有任何区别。很奇怪。 - jannej

1

基于“单手指”解决方案的 GestureDetector 不太可靠。在 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);
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接