gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:59:18 26 4
gpt4 key购买 nike

我有一个带有按钮、图像和 WebView 的 Activity 。我的目标是加载一个页面,然后在其上执行 javascript 以使用 HTML5 等绘制图形。

html5 绘制的图像高度未知/可变,但宽度应始终与手机的宽度/或浏览器窗口相同。

我有一个 javascript 接口(interface)来获取一个回调,其中包含它现在已经完成调用绘图函数的信息,它会给我高度。

这是 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);

}
});



}

我 View 中的按钮,我曾经使用此功能启动将我的 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 以某种方式失败了吗?

我添加了 sleep 来查看 webview 渲染和我从 javascript 获得的回调是否有某种有趣的延迟。

我也尝试过将 sleep 移动到 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 内容。感谢我的同事告诉我这件事。 :)

关于javascript - 将 Android webview 渲染为位图,html5 javascript,回调问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10009265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com