2012-04-04 37 views
5

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.

Respuesta

6

encontrado una solución, que iba a cambiar el renderCoupon a esto:

void renderCoupon(final int width,final int height){ 

    mWeb.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      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); 
     } 
    }, 100); 
} 

Y por supuesto que eliminan la materia del sueño en mi devolución de llamada. Gracias a mi colega que me dio consejos sobre esto. :)

Cuestiones relacionadas