我有一个按钮,图像和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,这也没有帮助。
我希望有人知道我应该寻找什么方向来解决这个问题。任何帮助表示赞赏。