2015-04-07 17 views
12

Web sayfasını görüntülemek için CrossWalk kullanıyorum, iyi çalışıyor. Tüm içeriği SDCard'a kaydetmek için bitmap olarak yakalama özelliğim var, ancak bir çözüm bulamıyorum. TextureView kullanarak sadece bir ekran boyutu bitmap yakalayabilir, herkes aynı sorunu yaşıyor mu? BTW, tüm içeriği WebView.draw() kullanarak yakalayabilirim.Web sayfasını görüntülemek için yaya geçidi kullanırken tüm görünümü Bitmap'e nasıl kaydedebilirim?

cevap

3

İşte yardımcı olabilecek bazı sözde kodlar. İçerik yüksekliğini ve genişliğini web görünümünden alabilir ve ardından webview.draw() 'dan yararlanarak aşağıdaki gibi bir şey yapabilirsiniz.

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

Sonra çıktı bir dosya çıkış akışı bitmap.compress ve çıkışını kullanmadan eşlem dosyası can

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

Bununla tahmin tek sorun eşlem içeriği kesme olabilmesidir WebView, içerik genişliğini elde etmek için bir yönteme sahip olmadığı için yatay olarak. Aksi halde bunun işe yarayacağını düşünüyorum.

+0

WebView içeriğini yakalamak için bu yöntemi kullanıyorum, ancak CrossWalk WebView üzerinde çalışmıyor. – handrenliang

+0

Çapraz yürüyüşe aşina değilim ama belgelerine baktığımda bunun işe yaramayacağı açıktır. Bunun için çok üzgünüm. XWalkView, web görünümü değil, FrameLayout alt sınıfıdır. Html'inizi web görünümüne yüklemekten ve oradan kaydetmekten sakınan bir şey var mı? –

+0

Bildiğiniz gibi, WebView 4.4 altında Web sayfasını sayfa oluşturmak için kullanır, bu berbat. 4.4'ün altında çalışmayan bir hiper metin düzenleyicisi oluşturuyorum. – handrenliang

3

Daha önce hiç yaya geçidi kullanmıyorum, ama Crosswalk WebView'in de android.view.View öğesinden türeyen olduğunu tahmin ediyorum. Eğer öyleyse, o zaman android görünümü çizim önbelleğini kullanabilirsiniz. Bu Paul söylediği gibi Sonra bu

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

benziyor Yaya Geçidi XWalkView donanım katmanıyla çalıştığı için yukarıdaki cevapları açıklandığı gibi (FileOutputStream

aracılığıyla
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
+0

öğesini kaydırmak zorundadır. GetDrawingCache(), tüm sayfa içeriğinin değil WebView'un yalnızca bir bölümünü alabilir. – handrenliang

2

Standart yollarla tarafından XWalkView görüntüsünü yakalamak olamaz kaydedin yani SurfaceView veya TextureView). Ancak bunu almak için TextureView sınıfının getBitmap() yöntemini kullanabilirsiniz. ile Kısacası

, sen XWalkView (örneğin uygulama alt sınıfta) başlatılır önce Yaya geçidinde TextureView kullanımı sağlamalıdır:

XWalkPreferences.setValue(XWalkPreferences.ANIMATABLE_XWALK_VIEW, true); 

Ve Gösterim ağacında TextureView bulmak üzerinde getBitmap() aramak için. Böyle

şey:

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

Kontrol bu kodu: Daha fazla ayrıntı için https://github.com/gitawego/cordova-screenshot/blob/master/src/android/Screenshot.java.

+0

Tüm ekran görüntüsünü ekranın bir parçası olarak görmek istiyorum. – handrenliang

İlgili konular