中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android 中怎么利用WebView 實現截圖

發布時間:2021-06-29 15:40:41 來源:億速云 閱讀:210 作者:Leah 欄目:移動開發

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 實現截圖問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

佛山市| 务川| 克什克腾旗| 灌南县| 台北市| 汝州市| 康马县| 资讯| 西贡区| 新竹市| 堆龙德庆县| 邢台市| 五峰| 类乌齐县| 保康县| 滦平县| 犍为县| 穆棱市| 庆城县| 定远县| 澄城县| 诸城市| 科技| 同江市| 措美县| 陵水| 汽车| 朔州市| 克什克腾旗| 峨边| 高阳县| 新巴尔虎左旗| 弥渡县| 大关县| 大足县| 安岳县| 勐海县| 中牟县| 商城县| 阿拉善左旗| 东辽县|