AndroidでWebViewコントロールの完全なスクリーンショットを実現

3361 ワード

最近、多くのアプリが文章やホームページの長いスクリーンショットをサポートしているのを見ることができて、好奇心から研究して、みんなに共有しました.ネット上には多くの例がありますが、その多くはもう時代遅れで復唱していないので、やはり通用する方法があることに気づきました.
//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のmeasure法によりwebviewのサイズ全体を再測定する.
  • はbitmapを作成し、そのサイズはwebviewの実際のサイズと同じです.
  • webviewをbitmapに描画する.
  • bitmapをSDカードに保存します.

  • これにより、WebViewの全体的なスクリーンショット機能が基本的に実現されます.もちろんまだ完璧ではありませんが、暇があれば補足します~~~