Tengo una actividad con un botón, una imagen y una vista web. Mi objetivo es cargar una página, luego ejecutar javascript en ella para dibujar gráficos usando HTML5 etc.Renderizando vista web de Android a mapa de bits, html5 javascript, devolución de llamada problema
La altura de la imagen dibujada por html5 es desconocida/variable, pero el ancho siempre debe ser el mismo que el del teléfono ancho/o ventana del navegador.
Tengo una interfaz de JavaScript para obtener una devolución de llamada que contiene información de que ya ha terminado de llamar a la función de dibujo, y me está dando la altura.
Aquí está la configuración de la vista web
mWeb = (WebView) findViewById(R.id.webView1);
mWeb.clearCache(true);
mWeb.addJavascriptInterface(new IJavascriptHandler(), "cpjs");
mWeb.getSettings().setJavaScriptEnabled(true);
mWeb.loadUrl(" http://theURL.com ");
mWeb.setInitialScale(100);
mWeb.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
mWeb.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url){
mWidth = mWeb.getWidth();
mHeight = mWeb.getHeight();
view.loadUrl("javascript: Tools.adjustWidth(" + mWidth + ")");
String javaCouponRender = "renderCoupon(" + kupongJson + ", 0); void(0)";
view.loadUrl("javascript: " + javaCouponRender);
}
});
}
y el botón que tengo en mi punto de vista, he utilizado para iniciar rendir mi vista web a una textura con esta función:
void renderCoupon(int width,int height){
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
final Canvas c =new Canvas(bitmap);
mWeb.draw(c);
imgView.setMinimumWidth(width);
imgView.setMinimumHeight(height);
imgView.setImageBitmap(bitmap);
imgView.setVisibility(View.VISIBLE);
}
Esto funciona. Presionando el botón, representa el contenido dibujado a la textura y la vista de la imagen tiene un resultado correcto. El único cavaet es que tengo que esperar hasta que la página se haya cargado/dibujado antes de presionar el botón.
Ahora, he implementado la devolución de llamada que recibo de Javascript como esto:
final class IJavascriptHandler {
IJavascriptHandler() {
}
public void couponRenderedCallback(final int height){
mHasGotRenderCallback = true;
mHeight = height;
Toast t = Toast.makeText(getApplicationContext(), "see if it helps sleeping", 2000);
t.show();
try{
Thread.sleep(5000);
}
catch(InterruptedException ex){
}
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast t2 = Toast.makeText(getApplicationContext(), "and now we render to texture", 2000);
t2.show();
renderCoupon(mWidth, mHeight);
}
});
}
}
Y cada vez, esta función de devolución de llamada se visualice una página en blanco. Lo curioso es que si presiono físicamente el botón de renderizar a textura tan pronto como veo que se llama a esta devolución de llamada, muestra el resultado esperado. ¿Es runOnUiThread que está fallando de alguna manera?
La suspensión es algo que agregué para ver si había algún tipo de retraso gracioso de la representación de la vista web y la devolución de llamada que obtengo de javascript.
También he intentado mover la suspensión al runOnUiThread, lo que tampoco ayudó.
Espero que alguien sepa en qué dirección debo mirar para resolver este problema. Cualquier ayuda es apreciada.