English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Implementierungsmethoden der WebView-Screenshot in Android

In Hybrid Apps tendieren die Methoden der Teile der Webseite für das Teilen immer mehr zu Diversifizierung, und die häufigsten Benutzeroperationen sind: das Kopieren von Webseitenlinks, das direkte Auswählen und Teilen mit Zielanwendungen usw. Unter diesen Bedingungen wird das Screenshot-Verhalten immer mehr zu einem interaktiven Weg, der die Benutzeroperationen bereichert und von den Benutzern geliebt wird, und wir können diese Funktion in vielen Inhaltsgemeinschaftsanwendungen sehen. In diesem Artikel wird eine Zusammenfassung der Implementierungsmethoden von WebView-Screenshots in Android-Anwendungen gegeben.

Als ein spezielles Steuerelement kann WebView nicht wie andere System-View oder Screenshots aufgenommen werden (meistens zum Screenshot von langen Bildern). Zum Beispiel:

public static Bitmap getScreenShot(View view){
  View screenView = view.getRootView();
  screenView.setDrawingCacheEnabled(true);
  Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
  screenView.setDrawingCacheEnabled(false);
  return bitmap;
}

Wenn das obige Code-Segment auf einem WebView verwendet wird, wird eine unvollständige Screenshot-Aufnahme erzeugt. Tatsächlich bietet das WebView-System selbst die entsprechenden API an, um Bitmap-Objekte zu erhalten.

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;
}

Nachdem das Bitmap-Objekt erhalten wurde, kann dieses Code-Teil verwendet werden, um es auf die Speicherkarte des Geräts zu speichern:

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();
 }
}

Einfach zwei Schritte, und das Werk ist getan. Allerdings, wenn Sie in Android 5.0 und höheren Versionen der Systemgeräte, wenn Sie operieren, finden Sie, dass der Screenshot nicht vollständig angezeigt wird. Obwohl die Bildgröße den tatsächlichen Anforderungen entspricht, enthält der Inhalt nur den Inhalt der WebView im aktuellen Bildschirmbereich.

Der Grund dafür liegt darin, dass ab Android 5.0 anfangen, kann das System intelligent Teile des Html-Dokuments rendern. Daher können wir standardmäßig nur den Inhalt der WebView im angezeigten Bereich der Bildschirmfläche abfangen, was zu dem oben genannten Problem führt.

Allerdings stellt das System auch die entsprechenden API bereit, um dieses Standardoptimierungsverhalten zu ändern. Der Code ist einfach:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
 WebView.enableSlowWholeDocumentDraw();
}

Zu beachten ist, dass dieser Code vor der Erstellung der WebView-Instanz hinzugefügt werden muss. Wenn Activity verwendet wird, also vor setContentView().

Obwohl die Methode capturePicture() bereits die WebView-Screenshot abgreifen kann, ist dies ab API 19 Diese Methode wurde vom System obsolet gemacht. Stattdessen wird der onDraw() -Methode verwendet, um das Bitmap-Objekt zu erhalten.

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(在发送邮件时,请将#替换为@进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权的内容。)

Gefällt mir