Ответ 1
[Обратите внимание, что, поскольку я ответил на это, onNewPicture устарел (см. http://developer.android.com/reference/android/webkit/WebView.PictureListener.html и Что такое "Этот метод устарел" означает для разработчиков приложений). К сожалению, нет информации о том, что его заменяет, или о том, какие уровни API поддерживаются. Я предполагаю, что это означает, что вы используете это на свой страх и риск.]
Я думаю, что вы правильно поняли, что onNewPicture - это подходящее место для захвата скриншота загруженной страницы WeView, но также правильно, что трудно понять, когда делать захват.
Похоже, что WebView вызывает onNewPicture всякий раз, когда был какой-либо чертеж. Например, он многократно вызываетNewPicture, когда панель поиска находится в режиме ввода клавиатуры и курсор перемещается. Аналогичным образом, для некоторых веб-страниц (например, www.yelp.com/nyc) он повторно вызываетNewPicture, даже после того, как страница закончила рисование, вероятно, из-за мигающего курсора в поле поиска. Но с другой стороны он будет вызывать onNewPicture только один раз (например, если пользователь опустил элемент iGoogle).
Значит, нет простого правила? Подход к
- отслеживать ряд событий, которые связаны/влияют на загрузку страницы - например, shouldOverrideUrl, onPageFinished, изменения фокуса, прокрутка начала/конца, в дополнение к onNewPicture
- запустить таймер (2 сек. работает хорошо) на onNewPicture, reset с помощью нового onNewPicture
- реализует загрузку страницы FSM, которая использует события и таймер в качестве входных данных, и перемещается по серии переходов состояния/действия, до того момента, когда она решит, что она действительно имеет новое изображение.
Не очень, но он работает, причем очень мало случаев, когда он захватывает одну и ту же картинку дважды - и нет случаев, когда он не может захватить изображение, где он должен.