2012-04-04 23 views
5

私は、ボタンと画像、およびWebビューでアクティビティを持っています。 私の目標は、ページをロードし、HTML5などを使ってグラフィックスを描くためにJavaScriptを実行することです。Android webviewをビットマップにレンダリング、html5 javascript、コールバックの問題

html5で描画される画像の高さは不明ですが、変数は常に携帯電話のものと同じである必要があります幅/ブラウザウインドウ。

私はjavascriptインターフェイスを使用して、描画関数の呼び出しを終了したことを示す情報を含むコールバックを取得しています。ここで

は、WebViewの

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

これは動作します。ボタンを押すと、描画されたコンテンツがテクスチャにレンダリングされ、イメージビューに正しい結果が得られます。唯一のカバエは、ボタンを押す前にページが読み込まれるまで待たなければなりません。

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

     } 

    } 

たびは、このコールバック関数は白ページをレンダリング:

今、私はこのようにJavaScriptから取得するコールバックを実装しています。面白いことに、このコールバックが呼び出されるとすぐにrender-to-textureボタンを物理的に押すと、期待される結果が表示されます。それは何とか失敗しているrunOnUiThreadですか?

睡眠は私がwebviewのレンダリングと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); 
} 

をそしてもちろん、私は私のコールバックでスリープものを削除しました。私の同僚に感謝してくれてありがとう。 :)

関連する問題