web view 截圖
阿新 • • 發佈:2018-12-07
-
擷取整個 webview 的內容(包括未顯示的部分)
-
在實現之前需要了解幾個概念
-
webview.getContentHeight()
Gets the height of the HTML content.
獲取到的是 html 內容的高度,但是這個值的單位不是 px,而是 dp,所以不能直接拿來就用,需要先轉換成 px,後面再說。
-
webview.getWidth()
Return the width of your view.
這是 view 的方法,返回 view 的寬,高同理
-
沒有獲取 html 內容寬度的方法,想要獲取該值的話需要用 js 去獲取。
這幾個值瞭解了實現起來就很簡單了, 方法如下
-
-
public Bitmap snapshotView(WebView view){ // 獲取螢幕密度,用於把 dp 轉成 px float density = getResources().getDisplayMetrics().density; // 建立指定寬高的 bitmap 寬為 webview 的寬,高為 html 的高度(需要轉換成 px,否則生成的圖片不全)
除此之外還要在 setContentView() 之前為 webview 設定一個屬性
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.enableSlowWholeDocumentDraw(); }
-
-
只擷取可視部分,也就是與 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; }
-
獲取 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); } } }