Webview de Android: detecta cuándo finaliza la renderización
Quiero fotografiar el WebView después de cargar el WebView. Sin embargo, el bitmap devuelto siempre es nulo porque el render no se ha cargado completo aunque uso onPageFinished
. Busco en Internet y la gente sugiere usar WebView.PictureListener
, pero esta función está obsoleta en API 12 .
Algunos códigos
- Visualización de imágenes GIF mediante WebView
- Detección de cambios de selección en WebView
- Webview dentro del listview: conflictos de eventos táctiles Por lo tanto no puede pellizcar Zoom IN / OUT en android
- Cómo cargar cadena html en una vista web?
- WebView devuelve una ventana incorrecta.innerHeight
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(); } } }
- WebView detectar clic en iframe
- Navegador para Android WebView VS
- OnPageFinished está disparando antes de cargar la página
- Android WebView getContentHeight () siempre devuelve 0
- WebView Javascript cross domain de un archivo HTML local
- Webview hace que ANR
- Hacer referencia a la imagen en los elementos de HTML no funciona
- Android Performance XML Drawable vs CSS3 vs Imágenes
Usted debe tratar de usar un WebChromeClient
e implementar onProgressChanged
:
mButterflyWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int progress) { if (progress == 100) { // do screenshot } } });
EDIT : para comprobar si onPageStarted se carga más de una vez:
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); } });
Puedes hacerlo así, en tu WebView:
@Override public void invalidate() { super.invalidate(); if (getContentHeight() > 0) { // WebView has displayed some content and is scrollable. } }
Gracias a: https://stackoverflow.com/a/14678910/1310343
Finalmente conseguí el muy detallado para este problema. Esto explica por qué siempre devuelve bitmap nulo.
Cada cambio en mi aplicación es activado por una acción del usuario, así que me ocurrió una versión modificada que sólo activa invalidate () después de un touchEvent
Gracias por toda su ayuda.
WebView de Android se muestra en blanco / blanco, la vista no se actualiza en los cambios de css o cambios de HTML, las animaciones son intermitentes
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 } }
- Cómo llenar cada lado de un cubo con texturas diferentes en OpenGL ES 1.1?
- Nuevo ActionBarDrawerToggle cuando se utiliza AppCompatActivity