国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 中WebView 截圖的實現方式

2019-10-22 18:19:16
字體:
來源:轉載
供稿:網友

Hybrid App 中網頁部分的分享方式越來越趨向于多元化,比較常見的用戶操作方式有:復制網頁鏈接式,直接選擇目標應用自動分享式等。其中,截圖行為,越來越成為豐富用戶操作、備受用戶喜愛的互動方式之一,我們在很多內容社區類應用中都能看到這種功能。這篇文章總結一下 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; }});

最后一點,在實際使用過程中,我們還需要考慮到 Bitmap 的內存占用問題,做好異常捕獲,防止 OOM 的出現。

總結

以上所述是小編給大家介紹的Android 中WebView 截圖的實現方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丹棱县| 渑池县| 杭锦后旗| 东至县| 洪洞县| 济阳县| 南雄市| 毕节市| 万宁市| 钟祥市| 城步| 嘉兴市| 昂仁县| 思南县| 文山县| 乌苏市| 平凉市| 壤塘县| 资兴市| 普宁市| 江西省| 区。| 洛南县| 云南省| 长汀县| 大足县| 阿尔山市| 余干县| 全州县| 凤山县| 武隆县| 洛川县| 亳州市| 松阳县| 鞍山市| 榆林市| 河西区| 万年县| 凭祥市| 城口县| 县级市|