2015-04-07 5 views
12

Uso CrossWalk per visualizzare la pagina Web, funziona bene. Ho una funzione per catturare l'intero contenuto come bitmap da salvare in SDCard, ma non riesco a trovare una soluzione. Utilizzando TextureView puoi solo catturare una bitmap della dimensione dello schermo, chiunque ha lo stesso problema? A proposito, posso catturare l'intero contenuto utilizzando WebView.draw().Come posso acquisire l'intera vista in una bitmap quando si utilizza il crosswalk per visualizzare la pagina Web?

risposta

3

Ecco alcuni pseudo codice che può aiutare. È possibile ottenere l'altezza e la larghezza del contenuto dalla visualizzazione Web e quindi è possibile sfruttare webview.draw() ... quindi qualcosa di simile al seguente.

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

Poi si può produrre il file bitmap utilizzando bitmap.compress e l'output in un flusso di output di file

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

L'unico problema che prevedo con questo è che la bitmap può ritagliare il contenuto orizzontalmente poiché WebView non ha un metodo per ottenere la larghezza del contenuto. Altrimenti penso che questo dovrebbe funzionare.

+0

Io uso questo metodo per catturare contenuti WebView, ma non funziona sul passaggio pedonale WebView. – handrenliang

+0

Non ho familiarità con il cross walk ma guardando la loro documentazione è chiaro che questo non funzionerà. Mi dispiace per quello. XWalkView è una sottoclasse di FrameLayout, non della visualizzazione Web. C'è qualcosa che ti impedisce di caricare il tuo html in una webview e di salvarlo da lì? –

+0

Come sapete, WebView sotto 4.4 usa Webkit per eseguire il rendering della pagina, fa schifo. Creo un editor ipertestuale che non funziona bene sotto i 4.4. – handrenliang

3

ho mai usando strisce pedonali prima, ma sto cercando di indovinare il WebView pedonale è anche discendente di android.view.View. Se è così, allora potresti usare la cache di disegno di android view. E 'simile a questa

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

Poi, come ha detto Paolo, salvarlo attraverso FileOutputStream

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

getDrawingCache() può ottenere solo una parte del WebView non l'intero contenuto della pagina. – handrenliang

2

È un'immagine XWalkView Non è possibile acquisire con metodi standard, come descritto nelle risposte di cui sopra, perché pedonale XWalkView funziona con livello hardware (cioè SurfaceView o TextureView). Ma puoi usare il metodo getBitmap() della classe TextureView per ottenerlo.

In breve, si dovrebbe abilitare l'uso di TextureView in attraversamento pedonale prima XWalkView verrà inizializzato (in applicazione sottoclasse per esempio) con:

XWalkPreferences.setValue(XWalkPreferences.ANIMATABLE_XWALK_VIEW, true); 

E trovare TextureView nelle viste ad albero per chiamare getBitmap() su di esso.

Qualcosa del genere:

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

Controllare questo codice: https://github.com/gitawego/cordova-screenshot/blob/master/src/android/Screenshot.java per maggiori dettagli.

+0

Voglio catturare l'intera vista non una parte dello schermo di esso. – handrenliang

Problemi correlati