2015-04-07 7 views
12

Ich benutze CrossWalk, um Webseite anzuzeigen, es funktioniert gut. Ich habe eine Funktion, um den gesamten Inhalt als Bitmap zu speichern, in SDCard zu speichern, aber ich kann keine Lösung finden. Mit TexturView kann nur eine Bildschirmgröße Bitmap erfassen, hat jeder das gleiche Problem? Übrigens kann ich den gesamten Inhalt mit WebView.draw() erfassen.Wie kann ich die gesamte Ansicht in einer Bitmap erfassen, wenn ich den Zebrastreifen verwende, um die Webseite anzuzeigen?

Antwort

3

Hier ist ein Pseudo-Code, der helfen kann. Sie können die Höhe und Breite des Inhalts von der Webansicht abrufen und dann können Sie webview.draw() ... so etwas wie das Folgende nutzen.

Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(), webView.getContentHeight(), Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
webView.draw(canvas); 

Dann können Sie Ihre Ausgabe-Bitmap-Datei mit bitmap.compress und Ausgabe in einer Datei Ausgabestrom

//fos is a FileOutputStream, you can use something else if needed. bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);

Das einzige Problem, das ich mit diesem voraussehen ist, dass die Bitmap den Inhalt Clip kann horizontal, da WebView keine Methode zum Abrufen der Inhaltsbreite besitzt. Ansonsten denke ich, das sollte funktionieren.

+0

Ich verwende diese Methode, um WebView Inhalte zu erfassen, aber es funktioniert nicht mit CrossWalk WebView. – handrenliang

+0

Ich bin nicht vertraut mit Cross-Walk, aber mit Blick auf ihre Dokumentation ist klar, das wird nicht funktionieren. Es tut mir Leid. Die XWalkView ist eine Unterklasse von FrameLayout, nicht die Webansicht. Gibt es etwas, das Sie daran hindert, Ihren HTML-Code in eine Webansicht zu laden und von dort zu speichern? –

+0

Wie Sie wissen, verwenden WebView unter 4.4 Webkit, um Seite zu rendern, es saugt. Ich erstelle einen Hypertext-Editor, der unterhalb von 4.4 nicht gut funktioniert. – handrenliang

3

Ich benutze nie crosswalk vorher, aber ich vermute der Crosswalk WebView ist auch von android.view.View abgeleitet. Wenn ja, dann könnten Sie den Zeichnungscache von android view verwenden. Es sieht wie dieses

yourWebView.setDrawingCacheEnabled(true); 
Bitmap bmp = yourWebView.getDrawingCache(); 

Damals wie Paulus sagte, außer durch Fileoutputstream

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
+0

getDrawingCache() kann nur einen Teil des WebView nicht den gesamten Seiteninhalt erhalten. – handrenliang

2

Sie können nicht durch Standard-Wege XWalkView Bild erfassen, wie in den Antworten oben beschrieben, da Crosswalk XWalkView arbeitet mit Hardware-Schicht (zB SurfaceView oder TextureView). Sie können aber die getBitmap() - Methode der TextureView-Klasse verwenden.

Kurz gesagt, Sie sollten mit der TextureView in Fußgängerübergang aktivieren, bevor XWalkView wird (in Anwendungsunterklasse zum Beispiel) initialisiert werden mit:

XWalkPreferences.setValue(XWalkPreferences.ANIMATABLE_XWALK_VIEW, true); 

Und finden TextureView in Aussicht Baum GetBitmap() auf sie nennen.

So etwas:

/** 
    * Returns TextureView which is used in XWalkView 
    * 
    * @param group 
    * @return 
    */ 
private TextureView findXWalkTextureView(ViewGroup group) { 
    int childCount = group.getChildCount(); 
    for (int i = 0; i < childCount; i++) { 
     View child = group.getChildAt(i); 
     if (child instanceof TextureView) { 
      String parentClassName = child.getParent().getClass().toString(); 
      boolean isRightKindOfParent = (parentClassName.contains("XWalk")); 
      if (isRightKindOfParent) { 
       return (TextureView) child; 
      } 
     } else if (child instanceof ViewGroup) { 
      TextureView textureView = findXWalkTextureView((ViewGroup) child); 
      if (textureView != null) { 
       return textureView; 
      } 
     } 
    } 

    return null; 
} 

/** 
    * Example of capturing image from XWalkView based on TextureView 
    * 
    * @return 
    */ 
public Bitmap captureImage() { 
    if (mXWalkView != null) { 
     Bitmap bitmap = null; 

     boolean isCrosswalk = false; 
     try { 
      Class.forName("org.xwalk.core.XWalkView"); 
      isCrosswalk = true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     if (isCrosswalk) { 
      try { 
       TextureView textureView = findXWalkTextureView(mXWalkView); 
       bitmap = textureView.getBitmap(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 
      bitmap = Bitmap.createBitmap(mXWalkView.getWidth(), mXWalkView.getHeight(), Bitmap.Config.ARGB_8888); 
      Canvas c = new Canvas(bitmap); 
      mXWalkView.draw(c); 
     } 

     return bitmap; 
    } else { 
     return null; 
    } 
} 

Überprüfen Sie diesen Code: https://github.com/gitawego/cordova-screenshot/blob/master/src/android/Screenshot.java für weitere Details.

+0

Ich möchte die ganze Ansicht nicht ein Bildschirm Teil davon erfassen. – handrenliang

Verwandte Themen