Android中如何利用WebView實現(xiàn)截圖

今天小編給大家分享一下Android中如何利用WebView實現(xiàn)截圖的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了滴道免費建站歡迎大家使用!

WebView 作為一種特殊的控件,自然不能像其他系統(tǒng) 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 上使用,將會得到內(nèi)容不完整的截圖。而事實上,WebView 系統(tǒng)本身提供有對應(yīng)的 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 對象后,利用這段代碼可以將其保存到設(shè)備的存儲卡中:

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

簡單兩步,大功告成。然而當(dāng)你在 Android 5.0 及更高版本系統(tǒng)的設(shè)備中操作時,你會發(fā)現(xiàn),截圖顯示并不完全。雖然圖片寬高符合實際要求,但是內(nèi)容只包含當(dāng)前屏幕顯示區(qū)域內(nèi) WebView 的內(nèi)容。

原因在于,為了減少內(nèi)存占用和提升性能,從 Android 5.0 開始,系統(tǒng)能夠智能化地選擇部分 Html 文檔進(jìn)行渲染。所以,默認(rèn)情況下,我們只能截取到部分屏幕顯示區(qū)域內(nèi) WebView 的內(nèi)容,也就出現(xiàn)了上述問題。

不過,系統(tǒng)也提供了對應(yīng)的 API 來修改這一默認(rèn)優(yōu)化行為。代碼很簡單:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
 WebView.enableSlowWholeDocumentDraw();
}

需要注意的是,這段代碼必須添加在 WebView 實例被創(chuàng)建之前。如果使用 Activity 的話,也就是在 setContentView() 方法前面。

雖然 capturePicture() 方法已經(jīng)能夠獲取 WebView 截圖,但是到 API 19 時該方法被系統(tǒng)廢棄掉了。取而代之的是使用 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 開始也被系統(tǒng)廢棄掉了。所以獲取 scale 值的另一種更優(yōu)雅的方式是:

webView.setWebViewClient(new WebViewClient() {
 @Override
 public void onScaleChanged(WebView view,float oldScale, float newScale){
  super.onScaleChanged(view, oldScale, newScale);
  scale = newScale;
 }
});

以上就是“Android中如何利用WebView實現(xiàn)截圖”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁題目:Android中如何利用WebView實現(xiàn)截圖
地址分享:http://bm7419.com/article34/psccpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、全網(wǎng)營銷推廣用戶體驗、響應(yīng)式網(wǎng)站網(wǎng)站導(dǎo)航、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)