Как определить, полностью ли уменьшен масштаб WebView? - PullRequest
1 голос
/ 06 января 2011

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

Ответы [ 5 ]

3 голосов
/ 22 июля 2015

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 максимально увеличен с самого начала.

3 голосов
/ 26 ноября 2012

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

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

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

Если defaultScale <<code>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;
    }
}
1 голос
/ 06 января 2011

Создайте свой собственный класс, который расширяет 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, это шестнадцатеричное значениедля «это =», и они не имеют отношения к состоянию масштабирования.Выше регистрируются две попытки сжатия, когда экран был полностью уменьшен.

1 голос
/ 06 января 2011

Мне любопытно посмотреть, что еще кто-нибудь может придумать, но я смог сделать это с помощью 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
   }

}

Ширина прокрутки равна document.body.scrollWidth

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

0 голосов
/ 06 января 2011
if( !webView.zoomOut () ){
   // couldn't zoom out because the zoom out did nothing :(
   // THIS IS WHAT YOU WANT TO KNOW!
} else{
    webView.zoomIn(); // restore
}

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

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

...