English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En los Hybrid App, las formas de compartir la parte web cada vez son más diversificadas, y las operaciones comunes de los usuarios incluyen: copiar el enlace del sitio web, seleccionar automáticamente la aplicación objetivo para compartir, etc. Entre ellos, la acción de captura de pantalla se ha convertido cada vez más en una de las formas interactivas favoritas de los usuarios para enriquecer las operaciones del usuario. Podemos ver esta función en muchos aplicaciones de comunidad de contenido. Este artículo resume los métodos de implementación de la captura de pantalla de WebView en aplicaciones Android.
WebView, como un control especial, naturalmente no puede obtener capturas de pantalla de la misma manera que otros View del sistema o métodos de captura de pantalla (por lo general, para capturar imágenes largas). Por ejemplo:
public static Bitmap getScreenShot(View view){ View screenView = view.getRootView(); screenView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); screenView.setDrawingCacheEnabled(false); return bitmap; }
Si se utiliza el código anterior en un WebView, se obtendrá una captura de pantalla incompleta. De hecho, el sistema WebView proporciona API correspondientes para obtener objetos 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; }
Después de obtener el objeto Bitmap, puede usar este código para guardarlo en la tarjeta de almacenamiento del dispositivo:
private void saveBitmap(Bitmap bitmap){ File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()) + ".jpg"); try { FileOutputStream fos = new FileOutputStream(file); bitmap.compress(CompressFormat.JPEG, 8(0, 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; }
Otra cosa que quiero mencionar es que el método getScale() desde API 17 Inicialmente también fue desechado por el sistema. Por lo tanto, otra forma más elegante de obtener el valor de scale es:
webView.setWebViewClient(new WebViewClient() { @Override public void onScaleChanged(WebView view,float oldScale, float newScale){ super.onScaleChanged(view, oldScale, newScale); scale = newScale; } });
Por último, en el proceso de uso real, también necesitamos considerar el problema de ocupación de memoria de Bitmap, realizar una captura de excepciones adecuada y evitar la aparición de OOM.
Resumen
Lo mencionado anteriormente es la forma en que el editor les ha presentado la implementación de la captura de pantalla de WebView en Android, esperamos que les sea útil. Si tienen alguna pregunta, déjenos un mensaje y el editor les responderá a tiempo. También les agradecemos mucho por su apoyo a los tutoriales de grito!
Declaración: El contenido de este artículo se ha obtenido de la red, pertenece al propietario original, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume responsabilidad alguna por la ley. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.