Как получить масштаб веб-просмотра в Android 4

WebView.getScale() устарел (но все еще можно использовать)

Рекомендуемый способ получить масштаб для веб-просмотра — использовать WebViewClient.onScaleChanged() http://developer.android.com/reference/android/webkit/WebViewClient.html#onScaleChanged(android.webkit.WebView, float, float)

Я добавил соответствующий обработчик в свой собственный веб-просмотр:

public class CustomWebView extends WebView {

public CustomWebView(Context context) {
    super(context);
    setWebViewClient(new WebViewClient() {
        @Override
        public void onScaleChanged(WebView view, float oldScale, float newScale) {
            super.onScaleChanged(view, oldScale, newScale);
            currentScale = newScale
        }
    });
}

А теперь проблема: метод не вызывается (по крайней мере, на моем нексусе 7), если я увеличиваю/уменьшаю масштаб с помощью щипка, поэтому он работает хорошо, только если я использую кнопку управления масштабированием.


person abovesun    schedule 18.04.2013    source источник
comment
Вы уже нашли ответ? У меня такая же проблема.   -  person Bart Burg    schedule 05.06.2013
comment
Не нашел способа даже отследить изменение масштаба, но моя цель состояла в том, чтобы отслеживать текущий масштаб, поэтому я был вынужден использовать устаревший WebView.getScale() вместо подхода прослушивателя масштаба. Если вам нужно отслеживать событие изменения масштаба в веб-просмотре, попробуйте установить пользовательский детектор жестов для веб-просмотра и просто отслеживать события сжатия. Не уверен, что это сработает, просто идея.   -  person abovesun    schedule 06.06.2013
comment
У меня пока нет решения (и я не думаю, что есть прямое, учитывая следующее), но я обнаружил причину: обратный вызов ScaleDetectorListener.onScaleEnd в WebView (а позже и во вспомогательном классе ZoomManager) приводит либо к setNewZoomScale ( для версии WebKit) или setZoomScale (для версии ZoomManager) вызывается с масштабом mActualScale, и эти методы будут запускать onScaleChanged только тогда, когда предоставленный масштаб не равен mActualScale (есть еще одно требование !mPreviewZoomOnly, но оно выполняется, поскольку onScaleEnd устанавливает его до false).   -  person JAB    schedule 26.03.2014
comment
Раздражает то, что эта ошибка существует, по крайней мере, с Gingerbread, но я ничего не вижу об этом в системе отслеживания проблем Android, а с переходом на реализацию на основе Chromium в KitKat, вероятно, проблема никогда не будет решена для классического WebView.   -  person JAB    schedule 26.03.2014


Ответы (2)


Я разрабатываю API уровня 17 и по той же причине использовал устаревший метод getScale(). WebViewClient.onScaleChanged() просто не срабатывал, когда я изменил масштаб с помощью масштабирования в WebView. У меня есть собственный GestureListener в моем расширенном WebView, который ведет себя по-разному при увеличении масштаба (масштаб 1.0+). Я не мог надежно получить правильное значение масштаба, когда устанавливал переменную класса в onScaleChanged().

person 3k-    schedule 26.07.2013

пытаться :

public MyWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    setWebViewClient(new WebViewClient() {
        @Override
        public void onScaleChanged(WebView view, float oldScale, float newScale) {
            super.onScaleChanged(view, oldScale, newScale);
            currentScale = newScale;
        }
    });
}
person smr fakhri    schedule 11.07.2013
comment
параметры конструктора: MyWebView (контекст контекста, атрибуты AttributeSet) - person smr fakhri; 09.09.2013