从WebView捕获图片

时间:2010-12-27 11:45:31

标签: android android-webview

是否可以监听WebView页面加载是否已完成,然后捕获已加载页面的屏幕截图?

我尝试了两种方法,但它们都不起作用:

  • 使用WebViewClientonPageFinished(WebView view, String url) 它不起作用(并在文档中描述),因为图片可能还没有准备就绪

  • 使用WebView.PictureListeneronNewPicture(WebView view, Picture picture)
    它也没有解决问题,因为这种方法调用不确定的时间。第一次,图片通常只包含部分页面内容。而且我不知道如何判断当前的呼叫是否为该页面的最后一次。

我想注意,问题是要找到合适的时机来制作屏幕截图,而不是如何完成。

1 个答案:

答案 0 :(得分:5)

[请注意,自从我回答此问题后,onNewPicture已被弃用(请参阅http://developer.android.com/reference/android/webkit/WebView.PictureListener.htmlWhat does "This method is deprecated" mean for application developers)。遗憾的是,没有关于替换它的内容或支持的API级别的信息。我想这意味着你自己承担风险。]

我认为你是正确的,onNewPicture是捕获加载的WeView页面截图的正确位置,但也纠正了很难知道何时实际进行捕获。

似乎只要有任何绘图,WebView就会调用onNewPicture。例如,当搜索栏处于键盘输入模式且光标轻弹时,它会重复调用onNewPicture。类似地,对于某些网页(例如www.yelp.com/nyc),即使在页面完成绘制之后,它也会反复调用onNewPicture,这可能是因为搜索框中闪烁的光标。但在另一个极端,它只会调用onNewPicture一次(例如,如果用户放下iGoogle项目)。

所以没有简单的规则吗?我们采取的方法是

  • 监控涉及/影响页面加载的一系列事件 - 例如shouldOverrideUrl,onPageFinished,焦点更改,滚动开始/结束,以及onNewPicture
  • 在onNewPicture上运行一个计时器(2秒运行良好),由新的onNewPicture重置
  • 实现一个页面加载FSM,它使用事件和计时器到期作为输入,并通过一系列状态/动作转换,直到它确定它真正有新图片。

不漂亮,但它很有效,极少数情况下它会捕获相同的图片两次 - 并且没有它无法捕捉图片的情况。