Захватить изображение из WebView - PullRequest
5 голосов
/ 27 декабря 2010

Можно ли прослушать загрузку страницы WebView полностью завершенной, а затем сделать снимок экрана загруженной страницы?

Я пробовал два способа, но они оба не работают:

  • с использованием WebViewClient и onPageFinished(WebView view, String url).
    Это не работает (и описано в документации), потому что в этот момент картинка может быть не готова

  • с использованием WebView.PictureListener и onNewPicture(WebView view, Picture picture)
    Это также не решает проблему, потому что этот метод вызывает неопределенное время. Поначалу картинка часто содержит только часть содержимого страницы. И я не знаю, как определить, что текущий вызов является последним для страницы.

Хочу заметить, что проблема в том, чтобы найти подходящий момент, чтобы сделать скриншот, а не как это сделать.

1 Ответ

5 голосов
/ 31 марта 2011

[Обратите внимание, что с тех пор, как я ответил на это, onNewPicture устарело (см. http://developer.android.com/reference/android/webkit/WebView.PictureListener.html и Что означает "Этот метод устарел" для разработчиков приложений ). К сожалению, нет информации о том, что его заменяет или на каких уровнях API это поддерживается. Я думаю, это означает, что вы используете это на свой страх и риск.]

Я думаю, вы правы в том, что onNewPicture - это правильное место для захвата скриншота загруженной страницы WeView, но также правильно, что трудно понять, когда на самом деле сделать захват.

Похоже, что WebView вызывает метод NewPicture всякий раз, когда был какой-либо рисунок. Например, он вызывает onNewPicture несколько раз, когда строка поиска находится в режиме ввода с клавиатуры, и курсор щелкает. Аналогичным образом, для некоторых веб-страниц (например, www.yelp.com/nyc) он повторно вызывает метод NewPicture, даже после того, как страница закончила рисовать, возможно, из-за мигающего курсора в поле поиска. Но с другой стороны, он будет вызывать onNewPicture только один раз (например, если пользователь выбрасывает элемент iGoogle).

Так что нет простого правила? Подход, который мы взяли, заключается в том, чтобы

  • отслеживать ряд событий, которые влияют на загрузку страницы или влияют на них - например, shouldOverrideUrl, onPageFinished, изменения фокуса, прокрутка начала / конца, в дополнение к onNewPicture
  • запустить таймер (2secs работает хорошо) на onNewPicture, сбросить с помощью нового onNewPicture
  • реализует загрузочную страницу FSM, которая использует события и истечение времени таймера в качестве входных данных и перемещается через серию переходов между состояниями и действиями, до точки, где она решает, что у нее действительно новая картина.

Не красиво, но это работает, с очень немногими случаями, когда он захватывает одно и то же изображение дважды - и нет случаев, когда ему не удается сделать снимок там, где он должен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...