将Android网络视图渲染为位图,html5 javascript,回调问题
Rendering Android webview to bitmap, html5 javascript , callback issue
我有一个带有按钮、图像和网络视图的活动。我的目标是加载一个页面,然后在上面执行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);
}
});
}
我在视图中的按钮,我已经用这个功能启动将我的网络视图渲染为纹理:
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);
}
});
}
}
每次,这个回调函数都会呈现一个白色页面。有趣的是,如果我在看到调用此回调时立即按"渲染到纹理"按钮,它会显示预期的结果。是runOnUiThread以某种方式失败了吗?
睡眠是我添加的东西,我想看看网络视图渲染和从javascript得到的回调是否有某种有趣的延迟。
我还尝试过将睡眠转移到runOnUiThread中,这也没有帮助。
我希望有人知道我应该朝着什么方向去解决这个问题。感谢您的帮助。
找到了一个解决方案,将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内容。感谢我的同事向我透露了这件事
相关文章:
- 下载HTML5/Javascript MOBILE应用程序中的PDF文件
- 是否可以使用HTML5/javascript播放此流
- 条形图元素的HTML5 JavaScript锚点
- Teechart HTML5/Javascript价值股票代码将保留在Tee.Line系列上
- 如果按下两个不同的键,如何使事件发生(HTML5 Javascript)
- HTML5/JavaScript图像点击事件
- 对象数组上的html5 javascript冲突
- 显示/隐藏 选择 HTML5 JavaScript
- HTML5 & Javascript
- Windows 8 HTML5 JavaScript 应用程序中向左滑动的事件名称是什么
- HTML5/JavaScript.使用索引数据库时无法插入数据
- 如何在HTML5 / javascript中查找十六进制值的特定位或数字
- 当以表单形式提交时,是否可以在PHP中访问新的数据* HTML5 / Javascript值?
- HTML5 Javascript播放/暂停按钮
- 如何使用HTML5/JavaScript检查连接类型(WiFi/LAN/WWAN)
- HTML5/Javascript验证复选框提交URL重定向
- 如何防止使用HTML5/Javascript在长触摸/点击时选择画布
- HTML5/JavaScript游戏-编辑JS代码以更改AJAX请求
- HTML5+Javascript音频在音频播放的特定时间触发事件
- html5 javascript,全局变量