Как определить, полностью ли уменьшен масштаб WebView?

1

Я ищу способ определить, полностью ли увеличен WebView. Я знаю, что вы можете получить логическое возвращаемое значение из ZoomOut(), но это приведет к уменьшению масштаба. Я просто хочу просто знать, может ли это сделать.

Теги:
scroll
webview
zoom

5 ответов

3
Лучший ответ

Я использую свой собственный класс WebView.

Получите WebView таблицу высот и внутреннюю html-страницу contentHeight.

Рассчитайте defaultScale = WebView.getHeight() / WebView.getContentHeight(); и currentScale = WebView.getScale().

Если defaultScale < currentScale он увеличен.

public class NoZoomControllWebView extends WebView {

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @SuppressWarnings("deprecation")
    public boolean isZoomed () {
        boolean result = false;

        int contentHeight = getContentHeight();
        int viewHeight = getHeight();

        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR1 ) {
            float scale = getScale();
            int temp = (int)(((float)viewHeight / (float)contentHeight) * 100);

            if (temp < (int)(scale * 100)) {
                result = true;
            }
        } else {
            float scale = getScale();
            int temp = (int)(((float)viewHeight / (float)contentHeight) * 100);

            if (temp < (int)(scale * 100)) {
                result = true;
            }
        }

        return result;
    }
}
2

getScaled() устарел, вы должны использовать onScaleChanged вместо вашего WebViewClient

Вы можете использовать его следующим образом:

            private boolean zoomed = false, firstRun = true;

            @Override
            public void onScaleChanged(WebView view, float oldScale,
                    float newScale) {
                if (firstRun) {
                    initScale = newScale;
                    firstRun=false;
                    zoomed = false;
                }
                else {
                    if (newScale>oldScale) {
                        zoomed = true;
                    }
                    else {
                        if (newScale<initScale) {
                            zoomed = false;
                        }
                    }
                }
                super.onScaleChanged(view, oldScale, newScale);
            }

если мы предположим, что WebView увеличен с самого начала.

  • 0
    Это не на 100% надежно, так как иногда уменьшение (или двойное нажатие, или пинч) может привести к тому, что масштабирование будет установлено в значение true (это немного сверхчувствительно в принципе), но это все же лучшее решение на этой странице, и это хорошо для моего случая использования. , Очистка флагов на странице начало + конец рекомендуется, хотя в противном случае вы можете остаться в неправильном состоянии.
1

Мне любопытно посмотреть, что еще кто-нибудь может придумать, но я смог выполнить это через javascript. Это разочаровывает, потому что я могу видеть значения, необходимые для того, чтобы легко определить это в исходном коде WebView, но они закрыты без геттеров...

В любом случае решение, которое я до сих пор добавляю, это JavaScriptInterface, который позволяет мне получить значение document.body.scrollWidth для страницы. Это дает мне прокручиваемую ширину, которая по какой-то причине недоступна, хотя существует метод getContentHeight(). Используя это, я могу рассчитать, полностью ли он увеличен.

Вот метод, который вызывает интерфейс javascript:

public void checkIfZoomedOut(int scrollWidth){
   int zoomedOutThreshold = 5; // If you want to include "nearly zoomed out"
   if( Math.abs(Math.ceil(mWebView.getScale() * scrollWidth) - mWebView.getWidth()) <= zoomedOutThreshold){
       // It is zoomed out
   } else {
       // It is zoomed in
   }

}

ScrollWidth - document.body.scrollWidth

Изменить: После дальнейших экспериментов я нашел защищенные методы, называемые computeHorizontalScrollRange() и computeHorizontalScrollExtent(), которые можно вызвать, если вы подклассифицируете WebView. Вы можете использовать их, чтобы определить, активна или необходима горизонтальная прокрутка. Тем не менее, некоторые веб-страницы могут быть полностью уменьшены (WebView не позволит вам уменьшить масштаб) и по-прежнему имеет горизонтальную полосу прокрутки, такую ​​как веб-страницы с текстом. Так что это не идеально.

1

Создайте свой собственный класс, который расширяет WebView и отменяет метод zoomOut(). Каждый раз, когда пользователь масштабируется, вызывайте super.zoomOut(). Сохраните то, что возвращается логической переменной с областью класса, чтобы ее можно было сохранить с помощью onSaveInstanceState() или в SharedPreferences, если это необходимо.

public class MyWebView extends WebView {

    // WebViews are generally zoomed out all the way when first created so set defaults
    private boolean lastZoomInResult = true;
    private boolean lastZoomOutResult = false;

    @Override
    public boolean zoomIn() {
        lastZoomInResult = super.zoomIn();
        return lastZoomInResult;
    }

    @Override
    public boolean zoomOut() {
        lastZoomOutResult = super.zoomOut();
        return lastZoomOutResult;
    }

РЕДАКТИРОВАТЬ: В ответ на это не работает для масштабирования зума... вы совершенно правы, и в конечном итоге ответ Кристиан верен.

Я подключил свой телефон через USB к моему компьютеру с помощью DDMS. Я вижу следующее, когда я зажимаю масштаб моего веб-представления...

01-06 03:18:19.052: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x849ac0), pid=23072, w=1, h=1
01-06 03:18:19.052: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x849ac0), pid=23072, w=1, h=1
01-06 03:18:19.082: DEBUG/SurfaceFlinger(92): Layer::requestBuffer(this=0x849ac0), index=0, pid=23072, w=480, h=74 success
01-06 03:18:19.832: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x738378), pid=23072, w=1, h=1
01-06 03:18:19.832: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x738378), pid=23072, w=1, h=1
01-06 03:18:19.852: DEBUG/SurfaceFlinger(92): Layer::requestBuffer(this=0x738378), index=0, pid=23072, w=480, h=74 success

Короче говоря, это не масштабирование WebView. То, что на самом деле происходит, - это цифровое масштабирование графического дисплея - содержимое WebView остается точно такого же размера, независимо от увеличения или уменьшения, но оно цифровое "увеличено" или "сжато", как цифровой зум на цифровой камере.

Я не совсем понимаю, что такое SurfaceFlinger, но из быстрого поиска Google мы говорим здесь о драйвере устройства.

Единственное, что изменяется в сообщениях журнала SurfaceFlinger, - это шестнадцатеричное значение для "this =", и они не имеют отношения к состоянию масштабирования. Вышеприведенная процедура регистрирует две попытки пинча, когда экран полностью уменьшен.

  • 0
    Это довольно хорошая идея, но эти методы вызываются только тогда, когда пользователь нажимает кнопку увеличения и уменьшения. Их не вызывают, если они щепотку масштабируют.
  • 0
    @littleFluffyKitty: см. мой ответ под кодом, который я первоначально разместил (с точки, помеченной как «РЕДАКТИРОВАТЬ:»).
Показать ещё 2 комментария
0
if( !webView.zoomOut () ){
   // couldn't zoom out because the zoom out did nothing :(
   // THIS IS WHAT YOU WANT TO KNOW!
} else{
    webView.zoomIn(); // restore
}

Я просто хочу просто знать, может ли это сделать.

Нет способа сделать это.

  • 0
    Если это единственный способ сделать это, есть ли способ сделать это мгновенно (без анимации), чтобы он не уменьшал и не увеличивал масштаб для пользователя?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню