【发布时间】:2013-06-06 11:16:10
【问题描述】:
我需要用 Canvas 绘制一个 WebView。我现在正在寻找两天的答案,但找不到任何我需要的东西。
目前我可以像这样显示 WebView
WebView wv = new WebView(this);
String htmlContent = foo_getHtmlContent();
wv.loadData(htmlContent, "text/html", "UTF-8");
setContentView(wv);
它工作得很好,但在 pos 0,0 处开始视图。 我也可以用这样的画布绘制一个视图(从 XML 膨胀)
LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = li.inflate(R.layout.layout_test, null);
v.measure(MeasureSpec.getSize(v.getMeasuredWidth()), MeasureSpec.getSize(v.getMeasuredHeight()));
v.layout(400, 400, 400, 400);
canvas.translate(100, 100);
v.draw(canvas);
这正是我想要绘制的方式,但视图错误。 我找不到将这两种方式结合起来以第二个代码(或任何类似方式)的方式从第一个代码中绘制视图的方法
有人知道如何用 Canvas 绘制 WebView 吗?
编辑:
没人知道吗?
现在我已经尝试过了,但由于缺少属性,我得到了 NullPointerException。
LayoutInflater li =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
WebView wv = null;
try
{
wv = (WebView) li.createView("WebView", "android.webkit.", null);
wv.loadData(htmlContent, "text/html", "UTF-8");
wv.measure(MeasureSpec.getSize(wv.getMeasuredWidth()),MeasureSpec.getSize(wv.getMeasuredHeight()));
wv.layout(100, 100, 400, 400);
canvas.translate(100, 100);
wv.draw(canvas);
}catch (InflateException e)
{
Log.e("Meassure", "InflateException: " + e);
} catch (ClassNotFoundException e)
{
Log.e("Meassure", "ClassNotFoundException: " + e);
}
有人知道如何创建合适的属性吗?
EDIT2:
我又来了。
我尝试了其他方法,并找到了一种使用 TextView 但不适用于 Web 视图的方法。
这个
LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = li.inflate(R.layout.layout_test, null);
TextView textView = (TextView) v.findViewById(R.id.textView1);
textView.setText("Hello World");
v.measure(MeasureSpec.getSize(v.getMeasuredWidth()), MeasureSpec.getSize(v.getMeasuredHeight()));
v.layout(400, 400, 400, 400);
canvas.translate(100, 100);
v.draw(canvas);
工作得很好,并且做了 TextView 应该做的所有事情,但这个
View v = li.inflate(R.layout.web_layout, null);
WebView wv = (WebView) v.findViewById(R.id.webView);
wv.loadData(htmlContent, "text/html", "UTF-8");
v.measure(MeasureSpec.getSize(v.getMeasuredWidth()), MeasureSpec.getSize(v.getMeasuredHeight()));
v.layout(400, 400, 400, 400);
canvas.translate(100, 100);
v.draw(canvas);//if i substitute this line by setContentView(v); it works but without positioning
什么都不做(除了向 LogCat 扔有趣的东西)。
LogCat 输出如下(大约每 10 毫秒重复一次):
06-17 14:04:06.210: D/webview(19424): [InitTabEffectPivot] >> nScreenWidth = 720
06-17 14:04:06.210: D/webview(19424): [InitTabEffectPivot] >> nScreenHeight = 1280
06-17 14:04:06.220: D/skia(19424): notifyPluginsOnFrameLoad not postponed
我也尝试调用 Thread.sleep(10) 在 wv.loadData 行之后,因为我在某处读到 WebView 需要一些时间来加载其内容,但这也不起作用。 至少有人知道 logcat 输出是什么意思吗?
【问题讨论】:
-
您还在寻找解决方案吗?我在 WebView 中放置了一个视图,并用一个组件填充了一个布局。如果您有兴趣,我可以发布代码。
-
请。我仍然有兴趣找到解决方案。
-
我正在寻找一种将javascript坐标转换为android坐标的方法,应该有一个公式。有了它,我会尽快更新。 github.com/GitHK/DivToView
-
该项目现在应该适用于所有显示器和屏幕尺寸!试一试,让我知道。 Android codeHTML code
-
抱歉,我不知道如何在运行时执行此操作。我的应用程序读取了一个配置文件,该文件定义了是否要显示任何内容以及显示位置,因此必须在运行时进行设置。
标签: android android-webview android-canvas android-view