1. 程式人生 > >Android WebView擷取所有內容生成長圖在5.0以上系統異常問題

Android WebView擷取所有內容生成長圖在5.0以上系統異常問題

最近在做webview擷取所有內容生成長圖時出現一些問題,在Android5.0以下系統能正常生成長圖,但是在5.0以上會出現只能擷取第一屏的內容,剩下的全部為空白,檢視資料發現原來是系統在5.0+版本上,Android對webview做了優化,為了減少記憶體佔用以提高效能,因此在預設情況下會智慧的繪製html中需要繪製的部分,其實就是當前螢幕展示的html內容,因此會出現未顯示的影象是空白的。解決方法如下:



如上圖:在activity的onCreate方法中的setContentView前加上一句enableSlowWholeDocumentDraw();意思為取消系統的智慧繪製,當然這樣之後效能會有所下降,但為了實現功能,也只能如此。

加上之後在Android5.0以下系統會崩潰,那是因為在5.0以下沒有enableSlowWholeDocumentDraw()這個方法,因此需要做個判斷,獲取本機系統版本號,當版本號大於5.0則呼叫enableSlowWholeDocumentDraw()方法,否則不呼叫。

程式碼為:API=21即為Android5.0系統

if (android.os.Build.VERSION.SDK_INT >= 21) {
    enableSlowWholeDocumentDraw();
}
下面為生成長圖程式碼:


public Bitmap viewShot
(final View view) { if (view == null) return null; view.setDrawingCacheEnabled(true); view.buildDrawingCache(); int measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); view.measure(measureSpec, measureSpec); if (view.getMeasuredWidth() <= 0
|| view.getMeasuredHeight() <= 0) { return null; } Bitmap bm; try { bm = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888); } catch (OutOfMemoryError e) { System.gc(); try { bm = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888); } catch (OutOfMemoryError ee) { return null; } } Canvas bigCanvas = new Canvas(bm); Paint paint = new Paint(); int iHeight = bm.getHeight(); bigCanvas.drawBitmap(bm, 0, iHeight, paint); view.draw(bigCanvas); showToast(getString(R.string.already_share_save_img)); return bm; }

完結...