1. 程式人生 > >Android上實現WebView控制元件的完整截圖

Android上實現WebView控制元件的完整截圖

最近總能看到好多APP都支援文章和網頁的長截圖,出於好奇研究了一下,分享給大家。
網上有好多的例子,其中好多都是已經過時的就不在複述了,我發現有一種還是比較通用的方法。

//android 5.0 之後需要開啟瀏覽器的整體快取才能擷取整個Web
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    WebView.enableSlowWholeDocumentDraw();
}

首先需要在WebView初始化之前(一般就是setContentView()方法呼叫之前)呼叫WebView的enableSlowWholeDocumentDraw()方法,開啟WebView的Html快取。因為在Android5.0之後Android系統上為了提升效能,在WebView增加了一個只渲染當前可見的Html的Document的特性。所以如果不開啟這個功能的話我們截圖的時候就只能得到部分網頁的截圖。
注意:開啟這個功能會提高效能開銷。


我先貼一下截圖的程式碼:

    public static boolean getFullWebViewSnapshot(WebView webView, String savePath) {
        //重新呼叫WebView的measure方法測量實際View的大小(將測量模式設定為UNSPECIFIED模式也就是需要多大就可以獲得多大的空間)
        webView.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0
, View.MeasureSpec.UNSPECIFIED)); //呼叫layout方法設定佈局(使用新測量的大小) webView.layout(0, 0, webView.getMeasuredWidth(), webView.getMeasuredHeight()); //開啟WebView的快取(當開啟這個開關後下次呼叫getDrawingCache()方法的時候會把view繪製到一個bitmap上) webView.setDrawingCacheEnabled(true); //強制繪製快取(必須在setDrawingCacheEnabled(true)之後才能呼叫,否者需要手動呼叫destroyDrawingCache()清楚快取)
webView.buildDrawingCache(); //根據測量結果建立一個大小一樣的bitmap Bitmap picture = Bitmap.createBitmap(webView.getMeasuredWidth(), webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888); //已picture為背景建立一個畫布 Canvas canvas = new Canvas(picture); // 畫布的寬高和 WebView 的網頁保持一致 Paint paint = new Paint(); //設定畫筆的定點位置,也就是左上角 canvas.drawBitmap(picture, 0, webView.getMeasuredHeight(), paint); //將webview繪製在剛才建立的畫板上 webView.draw(canvas); try { //將bitmap儲存到SD卡 FileTools.saveBitmap(picture, savePath); return true; } catch (IOException e) { e.printStackTrace(); return false; } }

其實很簡單,思路是這樣的:

  1. 通過WebView的measure方法重新測量webview的整個大小;
  2. 建立一個bitmap,它的大小和webview的真實大小一樣;
  3. 將webview繪製到bitmap上;
  4. 將bitmap儲存到SD卡上;

這樣基本能實現一個WebView的整體截圖功能。當然還不是很完善,有空再補充一下~~~