Android Webview: Détecter lorsque le rendu est fini
Je veux instantané de la WebView après la WebView est chargé. Cependant, le retour de l'image bitmap est toujours null car le rendu n'est pas chargé terminé, même si je les utilise onPageFinished
.
Je recherche sur Internet et de personnes suggèrent d'utiliser WebView.PictureListener
, mais cette fonction est désapprouvée dans l'API 12.
Certains codes
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();
}
}
}
OriginalL'auteur lolyoshi | 2014-01-08
Vous devez vous connecter pour publier un commentaire.
Vous devriez essayer d'utiliser un
WebChromeClient
et de mettre en œuvreonProgressChanged
:http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView, int)
MODIFIER : pour vérifier si onPageStarted est chargé plus d'une fois :
J'ai mis à jour le code ci-dessus mais cela ne fonctionne toujours pas 🙁
Sont votre onPageFinished et/ou onPageStarted appelé plusieurs fois, ou juste une fois ?
Je n'ai pas d'outrepasser ces fonctions. Jetez un oeil sur mes codes ci-dessus
Puis les remplacer et vérifier s'ils sont appelés à plusieurs reprises. Vous pouvez avoir un WebChromeClient & WebViewClient pour la même WebView.
OriginalL'auteur
Vous pouvez le faire comme ceci, dans votre WebView:
Grâce à: https://stackoverflow.com/a/14678910/1310343
OriginalL'auteur
Enfin j'ai eu la très détaillé pour ce problème. C'est ce qui explique pourquoi elle renvoie toujours null.
Chaque changement dans mon application sont déclenchés par une action de l'utilisateur alors je suis venu avec une version modifiée de déclencher invalidate() après un touchEvent
Merci à tous pour votre aide.
Android WebView rend en blanc/blanc, vue n'est pas mise à jour sur le css des changements ou des modifications HTML, les animations sont saccadées
OriginalL'auteur
La meilleure façon de détecter si une page a rendu consiste à utiliser le onPageCommitVisible rappel, disponible à partir de l'API 23.
onPageLoadFinished
n'est pas approprié, car il est livré trop tôt (quand le HTML est traité, mais n'a pas encore rendu).webview.setWebViewClient(nouveau WebViewClient() {
}
onPageCommitVisible
->onProgressChanged
->onPageFinished
OriginalL'auteur
il n'y avait pas d'autre réponse juste au-dessus quand j'ai écrit ma réponse. Nous avons donc à la fois vous a donné la même réponse 🙂
OriginalL'auteur