2012-04-04 46 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); 
} 

當然,我在回調除去睡眠的東西。感謝我的同事向我提出這個問題。 :)