English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
As maneiras de compartilhar a parte da web de um Hybrid App estão cada vez mais diversificadas, e as operações comuns dos usuários incluem: copiar o link da página da web, escolher automaticamente o aplicativo alvo para compartilhar diretamente, etc. Dentre elas, a ação de captura de tela está se tornando um dos métodos interativos mais enriquecedores e amados pelos usuários, que podemos ver essa função em muitos aplicativos de comunidade de conteúdo. Este artigo resume as maneiras de implementar a captura de tela do WebView em aplicativos Android.
Como um controle especial, o WebView não pode obter capturas de tela da mesma forma que outros View do sistema ou métodos de captura de tela (muitas vezes para capturar imagens longas). Por exemplo:
public static Bitmap getScreenShot(View view){ View screenView = view.getRootView(); screenView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); screenView.setDrawingCacheEnabled(false); return bitmap; }
Se aplicar o código acima a um WebView, obterá uma captura de tela incompleta. De fato, o sistema WebView fornece APIs correspondentes para obter 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; }
Após obter o objeto Bitmap, utilize este código para salvá-lo na memória de armazenamento do 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; }
Aqui também é necessário mencionar que o método getScale() da API 17 Agora, também é necessário mencionar que a outra maneira mais elegante de obter o valor de scale é:
webView.setWebViewClient(new WebViewClient() { @Override public void onScaleChanged(WebView view, float oldScale, float newScale){ super.onScaleChanged(view, oldScale, newScale); scale = newScale; } });
Por último, durante o uso real, precisamos considerar o problema de ocupação de memória do Bitmap, fazer uma captura de exceções para evitar a ocorrência de OOM.
Resumo
O que foi mencionado acima é a maneira de capturar a imagem da WebView no Android apresentada pelo editor. Esperamos que isso ajude a todos. Se você tiver alguma dúvida, por favor, deixe um comentário, o editor responderá a tempo. Agradecemos também o apoio ao tutorial de gritos!
Declaração: O conteúdo deste artigo é extraído da internet, pertencente ao respectivo detentor dos direitos autorais, o conteúdo é contribuído e carregado voluntariamente pelos usuários da internet, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por eventuais responsabilidades legais. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Caso seja confirmado, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)