国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

android中Webview實(shí)現(xiàn)截屏三種方式小結(jié)

2019-12-12 03:27:49
字體:
供稿:網(wǎng)友

本人最近學(xué)習(xí)了android中Webview實(shí)現(xiàn)截屏三種方式,下面我來記錄一下,有需要了解的朋友可參考。希望此文章對(duì)各位有所幫助。

第一種方式

通過調(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();//得到圖片的寬和高(沒有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ù)圖像,也就是長截屏的效果。這種方式在Android 4.4以下是沒有問題的,但是在5.0以上就行不通了。capturePicture()方法在4.4中廢棄掉了,官方建議使用onDrow()方法來獲取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中顯示出來的那部分,沒有顯示出來的部分是空白的。通過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ì)有顯著的性能開銷。

這里需要注意的是在傳遞webview的高度時(shí),是通過縮放率計(jì)算的,這樣就會(huì)算出繪制整個(gè)已加載的html內(nèi)容所需的高度。如果沒有這個(gè)縮放率,那么得到的快照就僅僅是這個(gè)html內(nèi)容最上面的那一段。還有一個(gè)問題就是在5.0+系統(tǒng)上得到快照比較模糊,在其他版本上沒有問題,不知道原因何在?

第二種方式

利用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來說也可以使用這種方式,在使用getDrawingCache()方法獲取bitmap對(duì)象前,先開啟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銷毀時(shí)進(jìn)行回收,所以開啟緩存的話會(huì)有性能開銷。

第三種方式

比較簡單,通過獲取當(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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 高密市| 滦平县| 泉州市| 揭东县| 大邑县| 孝义市| 滁州市| 太湖县| 寿阳县| 页游| 赞皇县| 南部县| 宿松县| 神农架林区| 治县。| 伊宁市| 武义县| 金川县| 凯里市| 峨边| 石台县| 宁阳县| 平南县| 湖南省| 来安县| 城市| 白银市| 乾安县| 张掖市| 铜鼓县| 巴里| 福海县| 沙洋县| 沁源县| 大英县| 涞水县| 巴林右旗| 灵山县| 武平县| 汝南县| 武冈市|