亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2017年03月07日 09:41:17   作者:littleKang  
本篇文章主要介紹了android Webview實現(xiàn)截屏,主要詳解了3種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

第一種方式

通過調用webview.capturePicture(),得到一個picture對象,根據(jù)圖像的寬和高創(chuàng)建一個Bitmap,再創(chuàng)建一個canvas,綁定bitmap,最后用picture去繪制。

//獲取Picture對象
Picture picture = wv_capture.capturePicture();
//得到圖片的寬和高(沒有reflect圖片內容)
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);
  //繪制(會調用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內容的高度
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)化,旨在減少內存占用以提高性能。因此在默認情況下會智能的繪制html中需要繪制的部分,其實就是當前屏幕展示的html內容,因此會出現(xiàn)未顯示的圖像是空白的。解決辦法是調用enableSlowWholeDocumentDraw()方法。這個方法需要在webview創(chuàng)建之前調用,在Activity里就是在setContentView前去調用,此方法會有顯著的性能開銷。

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

第二種方式

利用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 {
  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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論