Webview截圖三種方式

2021-09-07 13:08:27 字數 2342 閱讀 2632

第一種方式

通過呼叫webview.capturepicture(),得到乙個picture物件,根據影象的寬和高建立乙個bitmap,再建立乙個canvas,繫結bitmap,最後用picture去繪製。

//獲取picture物件

picture picture = wv_capture.capturepicture();

//得到的寬和高(沒有reflect內容)

int width = picture.getwidth();

int height = picture.getheight();

if (width > 0 && height > 0)

這種方式可以獲取webview中已載入的所有資料影象,也就是長截圖的效果。這種方式在android 4.4以下是沒有問題的,但是在5.0以上就行不通了。capturepicture()方法在4.4中廢棄掉了,官方建議使用ondrow()方法來獲取webview的bitmap快照。具體實現如下:

//獲取webview縮放率

float scale = wv_capture.getscale();

//得到縮放後webview內容的高度

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+上會發現,擷取的快照只顯示了webview中顯示出來的那部分,沒有顯示出來的部分是空白的。通過google找到了原因,在5.0+版本上,android對webview做了優化,旨在減少記憶體占用以提高效能。因此在預設情況下會智慧型的繪製html中需要繪製的部分,其實就是當前螢幕展示的html內容,因此會出現未顯示的影象是空白的。解決辦法是呼叫enableslowwholedocumentdraw()方法。這個方法需要在webview建立之前呼叫,在activity裡就是在setcontentview前去呼叫,此方法會有顯著的效能開銷。

這裡需要注意的是在傳遞webview的高度時,是通過縮放率計算的,這樣就會算出繪製整個已載入的html內容所需的高度。如果沒有這個縮放率,那麼得到的快照就僅僅是這個html內容最上面的那一段。還有乙個問題就是在5.0+系統上得到快照比較模糊,在其他版本上沒有問題,不知道原因何在?

第二種方式

利用view的快取功能。android為了提高滾動等各方面的繪製速度,可以為每乙個view建立乙個快取,使用 view.builddrawingcache為自己的view建立相應的快取, 這個cache就是乙個bitmap物件。利用這個功能可以對整個螢幕檢視進行截圖並生成bitmap,也可以 獲得指定的view的bitmap物件。

因此對於webview來說也可以使用這種方式,在使用getdrawingcache()方法獲取bitmap物件前,先開啟webview的快取功能.

webview.setdrawingcacheenabled(true);

...bitmap bitmap = webview.getdrawingcache();

需要注意的是,在上述情況下,這個快取bitmap物件只有乙個,因此每次獲取的bitmap指向的是同一塊位址空間的快取物件,如果在使用完bitmap後就立即**掉這個物件,那麼再次獲取當前view的快取物件時就會得到null。所以要在activity銷毀時進行**,所以開啟快取的話會有效能開銷。

第三種方式

比較簡單,通過獲取當前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  catch (exception e) finally 

}

具體demo猛戳這裡:

Webview截圖三種方式

通過呼叫webview.capturepicture 得到乙個picture物件,根據影象的寬和高建立乙個bitmap,再建立乙個canvas,繫結bitmap,最後用picture去繪製。獲取picture物件 picture picture wv capture.capturepicture 得...

C 中三種截圖方式總結

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using system.window...

WebView的截圖實現

webview的截圖主要有兩種實現方式 方式1 bitmap webview.getdrawingcache 可是,webview必需要mwebview.setdrawingcacheenabled true 此方式僅僅能擷取螢幕顯示的內容 方式2 picture snapshot webview....