如何确定WebView是否一直缩小

时间:2011-01-06 00:33:29

标签: android webview scroll zoom

我正在寻找一种方法来检测WebView是否完全缩小。我知道你可以从ZoomOut()获得一个布尔返回值,但是这将执行缩小。我只是想知道它是否可以。

5 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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从一开始就被缩放到最大值。

答案 2 :(得分: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的PC上。当我捏缩放我的Webview时,我看到以下内容......

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 ='的十六进制值,它们与缩放状态无关。以上是在屏幕完全缩小时记录两次捏合尝试。

答案 3 :(得分:1)

我很想知道其他人可能会想出什么,但我能够通过javascript实现这一目标。令人沮丧的是因为我可以看到在WebView的源代码中轻松确定这个值所需的值,但它们是私有的,没有getter ......

无论如何我到目前为止的解决方案是添加一个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

编辑:经过进一步的实验,我找到了名为computeHorizo​​ntalScrollRange()和computeHorizo​​ntalScrollExtent()的受保护方法,如果您继承WebView,则可以调用这些方法。您可以使用它们来确定水平滚动是否有效/需要。但是,某些网页可以完全缩小(WebView不会让您进一步缩小)并且仍然有一个水平滚动条,例如带有文本的网页。所以它并不完美。

答案 4 :(得分: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
}
  
    

我只是想知道它是否可以。

  

没有办法这样做。