android中Webview實(shí)現(xiàn)截屏三種方式小結(jié)
本人最近學(xué)習(xí)了android中Webview實(shí)現(xiàn)截屏三種方式,下面我來(lái)記錄一下,有需要了解的朋友可參考。希望此文章對(duì)各位有所幫助。
第一種方式
通過(guò)調(diào)用webview.capturePicture(),得到一個(gè)picture對(duì)象,根據(jù)圖像的寬和高創(chuàng)建一個(gè)Bitmap,再創(chuàng)建一個(gè)canvas,綁定bitmap,最后用picture去繪制。
//獲取Picture對(duì)象 Picture picture = wv_capture.capturePicture(); //得到圖片的寬和高(沒(méi)有reflect圖片內(nèi)容) int width = picture.getWidth(); int height = picture.getHeight(); if (width > 0 && height > 0) { //創(chuàng)建位圖 Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); //繪制(會(huì)調(diào)用native方法,完成圖形繪制) picture.draw(canvas); }
這種方式可以獲取webview中已加載的所有數(shù)據(jù)圖像,也就是長(zhǎng)截屏的效果。這種方式在Android 4.4以下是沒(méi)有問(wèn)題的,但是在5.0以上就行不通了。capturePicture()方法在4.4中廢棄掉了,官方建議使用onDrow()方法來(lái)獲取webview的bitmap快照。具體實(shí)現(xiàn)如下:
//獲取webview縮放率 float scale = wv_capture.getScale(); //得到縮放后webview內(nèi)容的高度 int webViewHeight = (int) (wv_capture.getContentHeight()*scale); Bitmap bitmap = Bitmap.createBitmap(wv_capture.getWidth(),webViewHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); //繪制 wv_capture.draw(canvas);
但是此時(shí)在5.0+上會(huì)發(fā)現(xiàn),截取的快照只顯示了webview中顯示出來(lái)的那部分,沒(méi)有顯示出來(lái)的部分是空白的。通過(guò)google找到了原因,在5.0+版本上,Android對(duì)webview做了優(yōu)化,旨在減少內(nèi)存占用以提高性能。因此在默認(rèn)情況下會(huì)智能的繪制html中需要繪制的部分,其實(shí)就是當(dāng)前屏幕展示的html內(nèi)容,因此會(huì)出現(xiàn)未顯示的圖像是空白的。解決辦法是調(diào)用enableSlowWholeDocumentDraw()方法。這個(gè)方法需要在webview創(chuàng)建之前調(diào)用,在Activity里就是在setContentView前去調(diào)用,此方法會(huì)有顯著的性能開(kāi)銷(xiāo)。
這里需要注意的是在傳遞webview的高度時(shí),是通過(guò)縮放率計(jì)算的,這樣就會(huì)算出繪制整個(gè)已加載的html內(nèi)容所需的高度。如果沒(méi)有這個(gè)縮放率,那么得到的快照就僅僅是這個(gè)html內(nèi)容最上面的那一段。還有一個(gè)問(wèn)題就是在5.0+系統(tǒng)上得到快照比較模糊,在其他版本上沒(méi)有問(wèn)題,不知道原因何在?
第二種方式
利用view的緩存功能。Android為了提高滾動(dòng)等各方面的繪制速度,可以為每一個(gè)view建立一個(gè)緩存,使用 View.buildDrawingCache為自己的view建立相應(yīng)的緩存, 這個(gè)cache就是一個(gè)bitmap對(duì)象。利用這個(gè)功能可以對(duì)整個(gè)屏幕視圖進(jìn)行截屏并生成Bitmap,也可以 獲得指定的view的Bitmap對(duì)象。
因此對(duì)于webview來(lái)說(shuō)也可以使用這種方式,在使用getDrawingCache()方法獲取bitmap對(duì)象前,先開(kāi)啟webview的緩存功能.
webView.setDrawingCacheEnabled(true); ... Bitmap bitmap = webView.getDrawingCache();
需要注意的是,在上述情況下,這個(gè)緩存bitmap對(duì)象只有一個(gè),因此每次獲取的bitmap指向的是同一塊地址空間的緩存對(duì)象,如果在使用完bitmap后就立即回收掉這個(gè)對(duì)象,那么再次獲取當(dāng)前view的緩存對(duì)象時(shí)就會(huì)得到null。所以要在Activity銷(xiāo)毀時(shí)進(jìn)行回收,所以開(kāi)啟緩存的話(huà)會(huì)有性能開(kāi)銷(xiāo)。
第三種方式
比較簡(jiǎn)單,通過(guò)獲取當(dāng)前window的DecorView,然后繪制Bitmap對(duì)象。
View view = context.getWindow().getDecorView(); Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); 保存到文件 try { String fileName = Environment.getExternalStorageDirectory().getPath()+"/webview_capture4.jpg"; FileOutputStream fos = new FileOutputStream(fileName); //壓縮bitmap到輸出流中 bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos); fos.close(); Toast.makeText(WebviewFromGetDecorView.this, "截屏成功", Toast.LENGTH_LONG).show(); } catch (Exception e) { Log.e(TAG, e.getMessage()); }finally { if(bitmap!=null) { bitmap.recycle(); } }
具體demo猛戳這里: WebviewCapture_jb51.rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android截屏方案實(shí)現(xiàn)原理解析
- Android截屏分享功能
- Android 下調(diào)試手機(jī)截屏的方法
- Android 實(shí)現(xiàn)截屏功能的實(shí)例
- android長(zhǎng)截屏原理及實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)截屏方式整理(總結(jié))
- Android截屏SurfaceView黑屏問(wèn)題的解決辦法
- Android截屏截圖的幾種方法總結(jié)
- Android 獲取瀏覽器當(dāng)前分享頁(yè)面的截屏示例
- Android實(shí)現(xiàn)矩形區(qū)域截屏的方法
- Android Activity 不能被截屏的解決方法
相關(guān)文章
基于移動(dòng)端真機(jī)調(diào)試的圖文教程(分享)
下面小編就為大家分享一篇基于移動(dòng)端真機(jī)調(diào)試的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12android實(shí)現(xiàn)widget時(shí)鐘示例分享
這篇文章主要介紹了android實(shí)現(xiàn)widget時(shí)鐘示例,需要的朋友可以參考下2014-03-03Android自定義View新年煙花、祝福語(yǔ)橫幅動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Android自定義View新年煙花、祝福語(yǔ)橫幅動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Android中判斷網(wǎng)絡(luò)連接狀態(tài)的方法
App判斷用戶(hù)是否聯(lián)網(wǎng)是很普遍的需求,這篇文章主要介紹了Android中判斷網(wǎng)絡(luò)連接狀態(tài)的方法,感興趣的朋友可以參考一下2016-02-02Android ListView中headerview的動(dòng)態(tài)顯示和隱藏的實(shí)現(xiàn)方法
這篇文章主要介紹了Android ListView中headerview的動(dòng)態(tài)顯示和隱藏的實(shí)現(xiàn)方法的相關(guān)資料,這里提供兩種方法幫助實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08Android開(kāi)發(fā)獲取手機(jī)Mac地址適配所有Android版本
這篇文章主要介紹了Android開(kāi)發(fā)獲取手機(jī)Mac地址適配所有Android版本,需要的朋友可以參考下2020-03-03Android 5.0+ 屏幕錄制實(shí)現(xiàn)的示例代碼
這篇文章主要介紹了Android 5.0+ 屏幕錄制實(shí)現(xiàn)的示例代碼,從 5.0 開(kāi)始,系統(tǒng)提供給了 app 錄制屏幕的一系列方法,不需要 root 權(quán)限,只需要用戶(hù)授權(quán)即可錄屏,相對(duì)來(lái)說(shuō)較為簡(jiǎn)單,感興趣的小伙伴們可以參考一下2018-05-05Android UI實(shí)現(xiàn)單行文本水平觸摸滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android UI實(shí)現(xiàn)單行文本水平觸摸滑動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10