2015-04-07 12 views
12

Tôi sử dụng CrossWalk để hiển thị trang web, nó hoạt động tốt. Tôi có một tính năng để nắm bắt toàn bộ nội dung dưới dạng bitmap để lưu vào SDCard, nhưng tôi không thể tìm thấy giải pháp. Sử dụng TextureView chỉ có thể chụp một bitmap có kích thước màn hình, bất kỳ ai cũng có cùng một vấn đề? BTW, tôi có thể nắm bắt toàn bộ nội dung bằng cách sử dụng WebView.draw().Làm thế nào tôi có thể chụp toàn bộ khung nhìn vào một Bitmap khi sử dụng lối qua đường để hiển thị trang web?

Trả lời

3

Dưới đây là một số mã giả có thể hữu ích. Bạn có thể nhận được chiều cao và chiều rộng nội dung từ webview và sau đó bạn có thể tận dụng webview.draw() ... vì vậy một cái gì đó như sau.

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

Sau đó, bạn có thể xuất tập tin bitmap của bạn sử dụng bitmap.compress và đầu ra nó vào một dòng đầu ra tập tin

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

Vấn đề duy nhất mà tôi thấy trước với điều này là bitmap của bạn có thể cắt nội dung theo chiều ngang vì WebView không có phương thức để có chiều rộng nội dung. Nếu không, tôi nghĩ rằng điều này sẽ làm việc.

+0

Tôi sử dụng phương pháp này để chụp nội dung WebView, nhưng nó không hoạt động trên WebView CrossWalk. – handrenliang

+0

Tôi không quen với việc đi bộ chéo nhưng nhìn vào sự hiểu biết của họ rõ ràng điều này sẽ không hiệu quả. Thành thật xin lỗi về điều đó. XWalkView là một lớp con của FrameLayout, không phải là dạng xem web. Có bất cứ điều gì ngăn cản bạn tải html của bạn vào một webview và lưu nó từ đó? –

+0

Như bạn đã biết, WebView dưới 4.4 sử dụng Webkit để hiển thị trang, nó hút. Tôi tạo một trình soạn thảo siêu văn bản không hoạt động tốt dưới 4.4. – handrenliang

3

Tôi chưa bao giờ sử dụng lối đi qua đường trước đây, nhưng tôi đoán rằng WebView lối đi cũng là hậu duệ của android.view.View. Nếu có, thì bạn có thể sử dụng bộ nhớ cache bản vẽ chế độ xem android. Nó trông như thế này

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

Sau đó, như Paul nói, lưu nó qua FileOutputStream

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

getDrawingCache() chỉ có thể nhận được một phần của WebView chứ không phải toàn bộ nội dung trang. – handrenliang

2

Bạn không thể chụp XWalkView hình ảnh bằng cách tiêu chuẩn như mô tả trong câu trả lời ở trên vì crosswalk XWalkView làm việc với lớp phần cứng (tức là SurfaceView hoặc TextureView). Nhưng bạn có thể sử dụng phương thức getBitmap() của lớp TextureView để lấy nó.

Nói tóm lại, bạn nên cho phép sử dụng của TextureView trong crosswalk trước XWalkView sẽ được khởi tạo (trong ứng dụng lớp con chẳng hạn) với:

XWalkPreferences.setValue(XWalkPreferences.ANIMATABLE_XWALK_VIEW, true); 

Và tìm TextureView trong cây xem để gọi getBitmap() trên đó.

Something như thế:

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

Kiểm tra mã này: https://github.com/gitawego/cordova-screenshot/blob/master/src/android/Screenshot.java để biết thêm chi tiết.

+0

Tôi muốn chụp toàn bộ khung nhìn không phải là một phần màn hình của nó. – handrenliang

Các vấn đề liên quan