AndroidでWebViewコントロールの完全なスクリーンショットを実現
3361 ワード
最近、多くのアプリが文章やホームページの長いスクリーンショットをサポートしているのを見ることができて、好奇心から研究して、みんなに共有しました.ネット上には多くの例がありますが、その多くはもう時代遅れで復唱していないので、やはり通用する方法があることに気づきました.
まず、WebViewを初期化する前に(一般的にsetContentView()メソッド呼び出しの前に)WebViewのenableSlowWholeDocumentDraw()メソッドを呼び出し、WebViewのHtmlキャッシュを開く必要があります.Android 5で0以降、Androidシステムでは、パフォーマンスを向上させるため、WebViewで現在表示されているHtmlのみをレンダリングするDocumentの特性が追加されました.だから、この機能をオンにしないと、私たちがスクリーンショットをするときは、一部のページのスクリーンショットしか得られません.注意:この機能をオンにすると、パフォーマンスオーバーヘッドが向上します.まず、スクリーンショットのコードを貼ります.
実は簡単です.考え方はこうです. WebViewのmeasure法によりwebviewのサイズ全体を再測定する. はbitmapを作成し、そのサイズはwebviewの実際のサイズと同じです. webviewをbitmapに描画する. bitmapをSDカードに保存します.
これにより、WebViewの全体的なスクリーンショット機能が基本的に実現されます.もちろんまだ完璧ではありませんが、暇があれば補足します~~~
//android 5.0 Web
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
WebView.enableSlowWholeDocumentDraw();
}
まず、WebViewを初期化する前に(一般的にsetContentView()メソッド呼び出しの前に)WebViewのenableSlowWholeDocumentDraw()メソッドを呼び出し、WebViewのHtmlキャッシュを開く必要があります.Android 5で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;
}
}
実は簡単です.考え方はこうです.
これにより、WebViewの全体的なスクリーンショット機能が基本的に実現されます.もちろんまだ完璧ではありませんが、暇があれば補足します~~~