Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Android webview渲染为位图、html5 javascript、回调问题_Javascript_Android_Html_Webview - Fatal编程技术网

将Android webview渲染为位图、html5 javascript、回调问题

将Android webview渲染为位图、html5 javascript、回调问题,javascript,android,html,webview,Javascript,Android,Html,Webview,我有一个带有按钮、图像和网络视图的活动。 我的目标是加载一个页面,然后在上面执行javascript,使用HTML5等绘制图形 html5绘制的图像高度未知/可变,但宽度应始终与手机的宽度/或浏览器窗口相同 我有一个javascript接口来获取一个回调,其中包含的信息现在已经完成了对绘图函数的调用,它给了我高度 下面是web视图的设置 mWeb = (WebView) findViewById(R.id.webView1); mWeb.clearCache(true); mWeb.addJav

我有一个带有按钮、图像和网络视图的活动。 我的目标是加载一个页面,然后在上面执行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);
}
这很有效。按下按钮,将绘制的内容渲染到纹理,imageview将获得正确的结果。唯一需要注意的是,在按下按钮之前,我必须等待页面加载/绘制完成

现在,我实现了从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吗

我添加睡眠是为了看看webview渲染和javascript回调是否有某种有趣的延迟

我还试着将睡眠转移到runOnUiThread中,这也没有帮助


我希望有人知道我应该朝什么方向去解决这个问题。非常感谢您的帮助。

找到了一个解决方案,将渲染组更改为:

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);
}
当然,我删除了回叫中的睡眠内容。多亏了我的同事,他给了我这个提示。:)