English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В Hybrid App способ обмена веб-частью становится все более разнообразным, наиболее распространенные способы взаимодействия пользователей включают: копирование ссылки на веб-страницу, прямое выборочное автоматическое делиться в целевом приложении и т.д. Сcreenshot-действие становится все более популярным способом взаимодействия, который нравится пользователям, и мы можем увидеть такую функцию во многих приложениях сообществ. Эта статья总结了 способ реализации захвата экрана WebView в приложениях Android.
WebView как особый виджет, естественно, не может быть использован для получения скриншотов, как другие системные View или способы экранного захвата (чаще всего для захвата длинных изображений). Например:
public static Bitmap getScreenShot(View view){ View screenView = view.getRootView(); screenView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); screenView.setDrawingCacheEnabled(false); return bitmap; }
Если использовать этот код с WebView, то можно получить неполное изображение. На самом деле, система WebView предоставляет соответствующие API для получения объекта Bitmap.
private Bitmap captureWebView(WebView webView){ Picture picture = webView.capturePicture(); int width = picture.getWidth(); int height = picture.getHeight(); if (width > 0 && height > 0) { Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); picture.draw(canvas); return bitmap; } return null; }
После получения объекта Bitmap с помощью этого кода можно сохранить его на карту памяти устройства:
private void saveBitmap(Bitmap bitmap){ File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg"); try { FileOutputStream fos = new FileOutputStream(file); bitmap.compress(CompressFormat.JPEG, 80, fos); fos.flush(); fos.close(); } catch (java.io.IOException e) { e.printStackTrace(); } }
Два простых шага, и все готово. Однако, когда вы работаете на устройствах с операционной системой Android 5.0 и выше, вы会发现, что скриншот не отображается полностью. Хотя размер изображения соответствует требованиям, содержимое включает только то, что отображается на текущем экране WebView.
Причина заключается в том, что начиная с Android 5.0, система может智能化地选择 часть Html документа для рендеринга. Поэтому, по умолчанию, мы можем захватить только часть содержимого WebView в области экрана, что и привело к возникновению вышеуказанной проблемы.
Однако, система также предоставляет соответствующие API для изменения этого стандартного оптимизационного поведения. Код очень прост:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { WebView.enableSlowWholeDocumentDraw(); }
需要注意的是,这段代码必须添加在 WebView 实例被创建之前。如果使用 Activity 的话,也就是在 setContentView() 方法前面。
Хотя метод capturePicture() уже может получить скриншот WebView, к API 19 этот метод был弃用 системой. Вместо этого используется метод onDraw() для получения объекта Bitmap.
private Bitmap captureWebView(WebView webView){ float scale = webView.getScale(); int width = webView.getWidth(); int height = (int) (webView.getHeight() * scale); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); webView.draw(canvas); return bitmap; }
Здесь снова нужно отметить, что метод getScale() был удален из системы с API 17. Поэтому еще одним более изящным способом получения значения scale является:
webView.setWebViewClient(new WebViewClient() { @Override public void onScaleChanged(WebView view,float oldScale, float newScale){ super.onScaleChanged(view, oldScale, newScale); scale = newScale; } });
В заключение, в процессе использования мы также должны учитывать проблему использования памяти Bitmap, выполнять捕获 исключительных ситуаций, чтобы предотвратить возникновение OOM.
Резюме
Как уже было сказано,小编给大家介绍了在Android中使用WebView截图的实现方法,希望对大家有所帮助。Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий, и я постараюсь ответить вам как можно скорее. Вновь хочу выразить благодарность всем, кто поддерживает呐喊教程!
Заявление: Контент этой статьи был взят из Интернета, авторские права принадлежат соответствующему автору. Контент был предоставлен пользователями Интернета в порядке самостоятельной подачи, сайт не обладает правами собственности, не был отредактирован вручную и не несет ответственности за связанные с этим юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @), чтобы сообщить о нарушении и предоставить соответствующие доказательства. При обнаружении факта нарушения мы незамедлительно удалим涉嫌侵权的内容。