您好,登錄后才能下訂單哦!
Android 中怎么利用WebView 實現截圖,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
WebView 作為一種特殊的控件,自然不能像其他系統 View 或者截屏的方式來獲取截圖(多為截取長圖)。如:
public static Bitmap getScreenShot(View view){ View screenView = view.getRootView(); screenView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); screenView.setDrawingCacheEnabled(false); return bitmap; }
如果將上述代碼套在 WebView 上使用,將會得到內容不完整的截圖。而事實上,WebView 系統本身提供有對應的 API 來獲取 Bitmap 對象。
private Bitmap captureWebView(WebView webView){ Picture picture = webView.capturePicture(); int width = picture.getWidth(); int height = picture.getHeight(); if (width > 0 && height > 0) { Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); picture.draw(canvas); return bitmap; } return null; }
獲取到 Bitmap 對象后,利用這段代碼可以將其保存到設備的存儲卡中:
private void saveBitmap(Bitmap bitmap){ File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg"); try { FileOutputStream fos = new FileOutputStream(file); bitmap.compress(CompressFormat.JPEG, 80, fos); fos.flush(); fos.close(); } catch (java.io.IOException e) { e.printStackTrace(); } }
簡單兩步,大功告成。然而當你在 Android 5.0 及更高版本系統的設備中操作時,你會發現,截圖顯示并不完全。雖然圖片寬高符合實際要求,但是內容只包含當前屏幕顯示區域內 WebView 的內容。
原因在于,為了減少內存占用和提升性能,從 Android 5.0 開始,系統能夠智能化地選擇部分 Html 文檔進行渲染。所以,默認情況下,我們只能截取到部分屏幕顯示區域內 WebView 的內容,也就出現了上述問題。
不過,系統也提供了對應的 API 來修改這一默認優化行為。代碼很簡單:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { WebView.enableSlowWholeDocumentDraw(); }
需要注意的是,這段代碼必須添加在 WebView 實例被創建之前。如果使用 Activity 的話,也就是在 setContentView() 方法前面。
雖然 capturePicture() 方法已經能夠獲取 WebView 截圖,但是到 API 19 時該方法被系統廢棄掉了。取而代之的是使用 onDraw() 方法獲取獲取 Bitmap 對象。
private Bitmap captureWebView(WebView webView){ float scale = webView.getScale(); int width = webView.getWidth(); int height = (int) (webView.getHeight() * scale); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); webView.draw(canvas); return bitmap; }
這里又要提到的是, getScale() 方法從 API 17 開始也被系統廢棄掉了。所以獲取 scale 值的另一種更優雅的方式是:
webView.setWebViewClient(new WebViewClient() { @Override public void onScaleChanged(WebView view,float oldScale, float newScale){ super.onScaleChanged(view, oldScale, newScale); scale = newScale; } });
關于Android 中怎么利用WebView 實現截圖問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。