Android Webview:渲染完成时检测

我想在加载WebView之后快照WebView。 但是,返回的位图始终为空,因为即使使用onPageFinished渲染尚未加载完成。 我在互联网上search,人们build议使用WebView.PictureListener ,但是这个函数在API 12中已经被弃用了

一些代码

 public class MainActivity extends Activity { private WebView mButterflyWebView; /** * Gets html content from the assets folder. */ private String getHtmlFromAsset() { InputStream is; StringBuilder builder = new StringBuilder(); String htmlString = null; try { is = getAssets().open(getString(R.string.butterfly_html)); if (is != null) { BufferedReader reader = new BufferedReader( new InputStreamReader(is)); String line; while ((line = reader.readLine()) != null) { builder.append(line); } htmlString = builder.toString(); } } catch (IOException e) { e.printStackTrace(); } return htmlString; } /** * Initializes views, controls... */ private void init() { mButterflyWebView = (WebView) findViewById(R.id.butterfly_webview); mButterflyWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 100){ if (capturePictureWebView() != null){ saveBitmapToFile(capturePictureWebView()); } } } }); } /** * Loads html page with the content. */ private void loadHtmlPage() { String htmlString = getHtmlFromAsset(); if (htmlString != null) mButterflyWebView.loadDataWithBaseURL( "file:///android_asset/images/", htmlString, "text/html", "UTF-8", null); else Toast.makeText(this, R.string.no_such_page, Toast.LENGTH_LONG) .show(); } /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); loadHtmlPage(); } private Bitmap capturePictureWebView() { mButterflyWebView.measure(MeasureSpec.makeMeasureSpec( MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); mButterflyWebView.layout(0, 0, mButterflyWebView.getMeasuredWidth(), mButterflyWebView.getMeasuredHeight()); mButterflyWebView.setDrawingCacheEnabled(true); mButterflyWebView.buildDrawingCache(); if (mButterflyWebView.getMeasuredWidth() == 0 || mButterflyWebView.getMeasuredHeight() == 0){ return null; } Bitmap bm = Bitmap.createBitmap(720, 1280, Bitmap.Config.ARGB_8888); System.out.println("width=" + mButterflyWebView.getMeasuredWidth()); System.out.println("height=" + mButterflyWebView.getMeasuredHeight()); Canvas bigcanvas = new Canvas(bm); // bigcanvas.scale(720/mButterflyWebView.getMeasuredWidth(), 1280/mButterflyWebView.getMeasuredHeight()); Paint paint = new Paint(); int iHeight = bm.getHeight(); bigcanvas.drawBitmap(bm, 0, iHeight, paint); mButterflyWebView.draw(bigcanvas); return bm; } private void saveBitmapToFile(Bitmap bitmap) { try { FileOutputStream out = new FileOutputStream("/storage/sdcard0/a.png"); bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); out.close(); } catch (Exception e) { e.printStackTrace(); } } } 

Solutions Collecting From Web of "Android Webview:渲染完成时检测"

你应该尝试使用WebChromeClient并实现onProgressChanged

http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView,int

 mButterflyWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int progress) { if (progress == 100) { // do screenshot } } }); 

编辑 :检查如果onPageStarted加载不止一次:

 mButterflyWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d("WebView", "onPageStarted " + url); } @Override public void onPageFinished(WebView view, String url) { Log.d("WebView", "onPageFinished " + url); } }); 

你可以这样做,在你的WebView中:

 @Override public void invalidate() { super.invalidate(); if (getContentHeight() > 0) { // WebView has displayed some content and is scrollable. } } 

感谢: https : //stackoverflow.com/a/14678910/1310343

最后我得到了非常详细的这个问题。 这解释了为什么它总是返回空位图。

我的应用程序的每一个变化都是由用户操作触发的,所以我想出了一个修改后的版本,只有在touchEvent后触发invalidate()

谢谢你的帮助。

Android的WebView呈现空白/白色,视图不更新的CSS更改或HTML更改,animation是波涛汹涌

 private class CfdWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.v(TAG, "shouldOverrideUrlLoading: " + url);; return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); Log.v(TAG, "onPageFinished: " + url); // do something } }