web view 截图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/miao9999/article/details/84618449
  1. 截取整个 webview 的内容(包括未显示的部分)

    1. 在实现之前需要了解几个概念

      1. webview.getContentHeight()

        Gets the height of the HTML content.

        获取到的是 html 内容的高度,但是这个值的单位不是 px,而是 dp,所以不能直接拿来就用,需要先转换成 px,后面再说。

      2. webview.getWidth()

        Return the width of your view.

        这是 view 的方法,返回 view 的宽,高同理

      3. 没有获取 html 内容宽度的方法,想要获取该值的话需要用 js 去获取。

      这几个值了解了实现起来就很简单了, 方法如下

    2. public Bitmap snapshotView(WebView view){
          // 获取屏幕密度,用于把 dp 转成 px
          float density = getResources().getDisplayMetrics().density;
          // 创建指定宽高的 bitmap 宽为 webview 的宽,高为 html 的高度(需要转换成 px,否则生成的图片不全)
          Bitmap temBitmap = Bitmap.createBitmap(view.getWidth(), (int) (view.getContentHeight() * density), Bitmap.Config.ARGB_4444);
          // 这里要记得把 bipmap 绘制出来,不然显示的图片是空白的
          Canvas canvas = new Canvas(temBitmap);
          view.draw(canvas);
          return temBitmap;
      }
      

      除此之外还要在 setContentView() 之前为 webview 设置一个属性

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
          WebView.enableSlowWholeDocumentDraw();
      }
      
  2. 只截取可视部分,也就是与 view 的大小一样的尺寸

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public Bitmap snapshotView(WebView view){
        //设置缓存
        view.setDrawingCacheEnabled(true);
        // 如果手动调用了 buildDrawingCache(),而没有调用 setDrawingCacheEnabled(true),之后应该调用 destroyDrawingCache() 清除缓存
        // 有关在兼容模式下自动缩放的注意事项:当不能自动缩放时,该方法会创建一个与 view 大小相同的 bitmap,因为这个 bitmap 会按照父容器的比例去绘制,屏幕上可能会显示缩放控件
        // 为了避免这个缩放,应该通过设置为可以自动缩放,这样的话会生成一个与 view 不一样的尺寸的 bitmap,这也意味着你的应用必须能处理这个尺寸
        // 当硬件加速开启的时候应该避免调用这个方法,如果不需要绘制缓存 bitmap 的话,开启会增加内存的消耗,并且会导致 view 在软件中呈现一次,因此会影响性能
        view.buildDrawingCache();
            /*1、从缓存中获取当前屏幕的图片,创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收
             如果直接是控件调用buildDrawingCache
             *是该控件当前显示在屏幕上的部分就不用减去状态栏的高度了
             */
        //
        view.getDrawingCache().setHeight(view.getHeight());
        Bitmap temBitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, 0, view.getWidth(), view.getHeight());
    
        //禁用DrawingCahce否则会影响性能 ,而且不禁止会导致每次截图到保存的是缓存的位图
        view.destroyDrawingCache();
        view.setDrawingCacheEnabled(false);
        return temBitmap;
    
    }
    
  3. 获取 html 内容的宽度

    mWebView.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT");
    
    mWebView.loadUrl(url);
    mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(final WebView view, String url) {
            super.onPageFinished(view, url);
    
        // 调用 js 方法  mWebView.loadUrl("javascript:window.HTMLOUT.getContentWidth(document.getElementsByTagName('html')[0].scrollWidth);");
    
        }
    });
    
    class JavaScriptInterface {
        int webviewContentWidth;
    
        @JavascriptInterface
        public void getContentWidth(String value) {
            if (value != null) {
                // 获取到html 的宽度值
                webviewContentWidth = Integer.parseInt(value);
                Log.e("MainActivity", "Result from javascript: " + webviewContentWidth);
            }
        }
    }
    

猜你喜欢

转载自blog.csdn.net/miao9999/article/details/84618449