从WebView捕获图片

Ale*_*sky 5 android android-webview

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

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

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

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

我想要注意的是,问题是要找到合适的时机来制作屏幕截图,而不是如何做到这一点.

Tor*_*rid 5

[请注意,自从我回答这个问题以来,onNewPicture已被弃用(请参阅http://developer.android.com/reference/android/webkit/WebView.PictureListener.html以及"不推荐使用此方法"对应用程序开发人员意味着什么).遗憾的是,没有关于替换它的内容或支持的API级别的信息.我想这意味着你使用它需要你自担风险.]

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

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

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

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

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