6

ボタンと画像と webview を含むアクティビティがあります。私の目標は、ページをロードし、その上でjavascriptを実行して、HTML5などを使用してグラフィックを描画することです.

html5 によって描画される画像の高さは不明/可変ですが、幅は常にスマートフォンの幅/ブラウザ ウィンドウと同じである必要があります。

描画関数の呼び出しが完了したという情報を含むコールバックを取得するためのJavaScriptインターフェイスがあり、高さを示しています。

これが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);

            }
             });



        }

そして、ビューにあるボタンを使用して、この関数を使用して 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);
}

これは機能します。ボタンを押すと、描画されたコンテンツがテクスチャにレンダリングされ、イメージビューは正しい結果になります。唯一の注意点は、ボタンを押す前に、ページがロード/描画されるまで待たなければならないことです。

これで、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);
                    }
                });

       }

    }

そして毎回、このコールバック関数は白いページをレンダリングします。面白いことに、このコールバックが呼び出されるのを確認してすぐに Render-to-Texture ボタンを物理的に押すと、期待どおりの結果が表示されます。どういうわけか失敗しているのはrunOnUiThreadですか?

スリープは、webview のレンダリングと javascript から取得したコールバックに何らかのおかしな遅延があったかどうかを確認するために追加したものです。

また、スリープを runOnUiThread に移動しようとしましたが、これも役に立ちませんでした。

この問題を解決するためにどの方向に目を向けるべきか誰かが知っていることを願っています。どんな助けでも大歓迎です。

4

1 に答える 1

7

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

そしてもちろん、コールバックで Sleep のものを削除しました。これについて教えてくれた同僚に感謝します。:)

于 2012-04-12T15:41:54.743 に答える