【问题标题】:Android: draw a WebView with CanvasAndroid:使用 Canvas 绘制 WebView
【发布时间】: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


【解决方案1】:

您需要了解几件事。第一,如果你想确保页面已经加载,你可以通过创建一个自定义的 WebViewClient 来做到这一点,并将其设置为你的 WebView

private class CustomWebViewClient extends WebViewClient {
...
@Override
public void onPageFinished(WebView view, String url) {
 super.onPageFinished(view, url);
// YOUR CODE HERE
}
...

wv.setWebViewClient(new CustomWebViewClient());

对于在画布上绘图,实际上有不止一种方法。一种简单的方法是,您可以从 Web 视图创建位图,如下所示:

webView.setDrawingCacheEnabled(true);
wv.buildDrawingCache(false);
Bitmap bmp = wv.getDrawingCache(false);
webView.setDrawingCacheEnabled(false);

Canvas canvas = new Canvas(bmp);

【讨论】:

  • 我已经尝试从我的 WebView 创建一个位图,但在位图 bmp = wv.getDrawingCache(false); bmp 每次都是 Null。在 //YOUR CODE HERE 部分我需要做什么?我已经尝试过 wv.setWebViewClient(new WebViewClient());位这不会改变任何东西(明显)
  • 我写了 onPageFinished 部分,因为你提到等待页面加载。基本上,这应该有效。无论如何,这个话题已经讨论了很多,我建议你试试这些:stackoverflow.com/questions/4633988/…mailinglistarchive.com/html/android-developers@googlegroups.com/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多