2012-04-04 50 views
5

我有一个按钮,图像和web视图的活动。 我的目标是加载一个页面,然后对其执行JavaScript以使用HTML5等绘制图形。将Android webview渲染为位图,html5 javascript,回调问题

由html5绘制的图像的高度未知/变量,但宽度应始终与手机的宽度相同宽度/或浏览器窗口。

我有一个JavaScript接口来获得一个回调,包含它现在已完成调用绘图功能的信息,它给了我身高。

这里是网页视图

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); 

      } 
      }); 



     } 

而且按钮我有我的观点的设置,我已经习惯了启动渲染我的WebView与此功能的质地:

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); 
} 

这可行。按下按钮,将绘制的内容呈现给纹理,并且图像视图具有正确的结果。唯一的cavaet是我必须等到页面已经加载/绘制之前按下按钮。现在

,我已经实现了我的回调从JavaScript得到这样的:

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); 
        } 
       }); 

     } 

    } 

而每一次,这个回调函数呈现一个白色的页面。有趣的是,如果我在看到这个回调被调用后立即按下了渲染到纹理按钮,它就会显示预期的结果。是否runOnUiThread失败了?

睡眠是我添加的东西,看看是否有某种有趣的延迟的Web视图渲染和我从JavaScript获得的回调。

我也尝试将睡眠移入runOnUiThread,这也没有帮助。

我希望有人知道我应该寻找什么方向来解决这个问题。任何帮助表示赞赏。

回答

6

找到了解决办法,这是对renderCoupon改成这样:

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); 
} 

当然,我在回调除去睡眠的东西。感谢我的同事向我提出这个问题。 :)