1. 程式人生 > >web view 截圖

web view 截圖

  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);
            }
        }
    }