私はAndroidサービスのWebレンダリングメカニズムとして機能するWebViewが必要なアプリケーションを作成しています。 WebViewがウィンドウに添付されることはありません。 しかし、ビュー(ViewGroup)を手作業で測定してレイアウトし、それをビットマップに描画することで、ビュー階層に配置することなくページのスナップショットを生成することができます。私はscrollTo()へのコールを行う一度scrollTo()の後にAndroid WebViewが破損しています
問題があり、スクロール前に隠されて、それをトリミングしたページの一部を描画しませんビュー、この
のようなものページのロードは、以下のコード
を用いprivate void layout(
@NonNull final WebView webView, final int targetWidth, final int targetHeight) {
webView.measure(
View.MeasureSpec.makeMeasureSpec(targetWidth, View.MeasureSpec.AT_MOST),
View.MeasureSpec.makeMeasureSpec(targetHeight, View.MeasureSpec.AT_MOST));
webView.layout(0, 0, targetWidth, targetHeight);
}
ビットマップがキャプチャされる次のような方法を使用して、要求されたのWebViewがレイアウトされるずっと前私は通常、私はそれをしたい場所のWebViewがスクロールされますアクティビティ内窓に取り付けたのWebView内のページをロードしたときにページがある:
private Bitmap capture(
@NonNull final WebView webView) {
webView.setDrawingCacheEnabled(true);
webView.buildDrawingCache();
final Bitmap bitmap = Bitmap.createBitmap(
webView.getWidth(), webView.getHeight(), Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);
webView.setDrawingCacheEnabled(false);
return bitmap;
}
は、全体的な手順は、これが重要
layout(mWebView, maxWidth, maxHeight);
// page is loaded
mWebView.scrollTo(...);
// here I've tried number of things like mWebView.invalidate(), mWebView.requestLayout() or mWebView.refreshDrawableState()
final Bitmap bitmap = capture(mWebView);
のようになりますうまく表示されます。
違いは何ですか?これは、WebViewがアクティビティのウィンドウにアタッチされているとき、アンドロイドとWebViewとはどのような違いがありますか?
'WebView'は、ウィンドウにアタッチされていないことが検出された場合、それ自体を再描画しない最適化を採用していると確信しています。 WebViewで 'invalidate()'を呼び出そうとしましたか?多分それは完全な再描画を強制するかもしれません... –
応答に感謝します。はい、あります。 私はrequestLayout()を試しただけでなく、ページが読み込まれた後の短い(〜1秒)タイムアウトの後にこれをやっています。 – foo
WebView、WebViewChromiumなど、何が起こっているのかを正確に理解するのは難しいですが、図面やスクロール機能の中にはWebViewをUIスレッド上で実行する必要がある/表示階層にアタッチする必要があることがあります。さらに、 'View.invalidate()'のように見えます(表示されない場合はスキップします)(http://grepcode.com/file/repository)。grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/View.java#View.skipInvalidate%28%29) –