android中Webview實現(xiàn)截屏三種方式小結(jié)
本人最近學(xué)習(xí)了android中Webview實現(xiàn)截屏三種方式,下面我來記錄一下,有需要了解的朋友可參考。希望此文章對各位有所幫助。
第一種方式
通過調(diào)用webview.capturePicture(),得到一個picture對象,根據(jù)圖像的寬和高創(chuàng)建一個Bitmap,再創(chuàng)建一個canvas,綁定bitmap,最后用picture去繪制。
//獲取Picture對象
Picture picture = wv_capture.capturePicture();
//得到圖片的寬和高(沒有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);
//繪制(會調(diào)用native方法,完成圖形繪制)
picture.draw(canvas);
}
這種方式可以獲取webview中已加載的所有數(shù)據(jù)圖像,也就是長截屏的效果。這種方式在Android 4.4以下是沒有問題的,但是在5.0以上就行不通了。capturePicture()方法在4.4中廢棄掉了,官方建議使用onDrow()方法來獲取webview的bitmap快照。具體實現(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);
但是此時在5.0+上會發(fā)現(xiàn),截取的快照只顯示了webview中顯示出來的那部分,沒有顯示出來的部分是空白的。通過google找到了原因,在5.0+版本上,Android對webview做了優(yōu)化,旨在減少內(nèi)存占用以提高性能。因此在默認情況下會智能的繪制html中需要繪制的部分,其實就是當(dāng)前屏幕展示的html內(nèi)容,因此會出現(xiàn)未顯示的圖像是空白的。解決辦法是調(diào)用enableSlowWholeDocumentDraw()方法。這個方法需要在webview創(chuàng)建之前調(diào)用,在Activity里就是在setContentView前去調(diào)用,此方法會有顯著的性能開銷。
這里需要注意的是在傳遞webview的高度時,是通過縮放率計算的,這樣就會算出繪制整個已加載的html內(nèi)容所需的高度。如果沒有這個縮放率,那么得到的快照就僅僅是這個html內(nèi)容最上面的那一段。還有一個問題就是在5.0+系統(tǒng)上得到快照比較模糊,在其他版本上沒有問題,不知道原因何在?
第二種方式
利用view的緩存功能。Android為了提高滾動等各方面的繪制速度,可以為每一個view建立一個緩存,使用 View.buildDrawingCache為自己的view建立相應(yīng)的緩存, 這個cache就是一個bitmap對象。利用這個功能可以對整個屏幕視圖進行截屏并生成Bitmap,也可以 獲得指定的view的Bitmap對象。
因此對于webview來說也可以使用這種方式,在使用getDrawingCache()方法獲取bitmap對象前,先開啟webview的緩存功能.
webView.setDrawingCacheEnabled(true); ... Bitmap bitmap = webView.getDrawingCache();
需要注意的是,在上述情況下,這個緩存bitmap對象只有一個,因此每次獲取的bitmap指向的是同一塊地址空間的緩存對象,如果在使用完bitmap后就立即回收掉這個對象,那么再次獲取當(dāng)前view的緩存對象時就會得到null。所以要在Activity銷毀時進行回收,所以開啟緩存的話會有性能開銷。
第三種方式
比較簡單,通過獲取當(dāng)前window的DecorView,然后繪制Bitmap對象。
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
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android上傳文件到Web服務(wù)器 PHP接收文件
這篇文章主要為大家詳細介紹了Android上傳文件到Web服務(wù)器,PHP接收文件的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
Android音視頻開發(fā)之MediaCodec的使用教程
在Android開發(fā)中提供了實現(xiàn)音視頻編解碼工具MediaCodec,針對對應(yīng)音視頻解碼類型通過該類創(chuàng)建對應(yīng)解碼器就能實現(xiàn)對數(shù)據(jù)進行解碼操作。本文通過示例詳細講解了MediaCodec的使用,需要的可以參考一下2022-04-04
Android開發(fā)實現(xiàn)繪制淘寶收益圖折線效果示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)繪制淘寶收益圖折線效果,涉及Android canvas圖形繪制及布局控制相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Android開發(fā)之瀏覽器用法實例詳解(調(diào)用uc,opera,qq瀏覽器訪問網(wǎng)頁)
這篇文章主要介紹了Android開發(fā)之瀏覽器用法,結(jié)合實例形式詳細分析了Android調(diào)用瀏覽器的具體步驟與相關(guān)使用技巧,需要的朋友可以參考下2016-01-01
Android應(yīng)用開發(fā):電話監(jiān)聽和錄音代碼示例
這篇文章主要介紹了Android應(yīng)用開發(fā)中電話監(jiān)聽和電話錄音的代碼實例,同時附錄了一個拍照、錄像的例子,需要的朋友可以參考下2014-04-04
Android多線程斷點續(xù)傳下載功能實現(xiàn)代碼
這篇文章主要為大家詳細介紹了Android多線程斷點續(xù)傳下載功能的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03

