Как отключить двойное масштабирование в Android WebView?

Как отключить двойное масштабирование в Android webview, Я перепробовал много вещей, но это не сработало. Пожалуйста, предложите мне правильное решение для достижения этой цели.

На самом деле я загружаю изображение из пользовательского HTML. Я должен отключить полное масштабирование для этого.

Я попробовал следующие вещи,

webview.getSettings().setSupportZoom(false);

и даже я сохранил метатег в HTML, и я делаю это как userscalable= no, Даже это не сработало для меня.

И я попытался с помощью GestureDetector.SimpleOnGestureListener

Пожалуйста, дайте мне знать, что я должен масштабировать что-либо в onDoubleTap,

4 ответа

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

После долгих исследований я объединил некоторые ответы, которые не работали отдельно, и понял, что вместе они отлично сработали для меня.

Это отключает двойное масштабирование в 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());

Но это не будет работать, если вы начнете код слишком рано, поэтому вы поместите этот код в переопределение onLayoutChange WebViewClient следующим образом:

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 не будет работать.

  • Вы должны называть это, когда его видимость "видима" или "невидима".

Вы проверяли вопрос ниже? Пожалуйста, проверьте, это может быть связано с вашим вопросом.

Android WebView использует setWideViewPort, отключить двойное увеличение, но сохранить масштабирование?

После многих проб и ошибок и исследований 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: /questions/25576711/android-obnaruzhivaet-dvojnoe-kasanie-bez-edinogo-kasaniya/25576729#25576729 /questions/15928069/android-webview-ispolzuet-setwideviewport-otklyuchit-dvojnoe-uvelichenie-no-sohranit-masshtabirovanie/15928083#15928083

Другие вопросы по тегам