2015-05-06 19 views
5

我想獲得該活動的「完整頁面」截圖。該視圖包含具有許多項目的RecyclerView。在完整長度中截取RecyclerView的截圖

我可以使用此功能在當前視圖的屏幕截圖:

public Bitmap getScreenBitmap() { 
    View v= findViewById(R.id.container).getRootView(); 
    v.setDrawingCacheEnabled(true); 
    v.buildDrawingCache(true); 
    Bitmap b = Bitmap.createBitmap(v.getDrawingCache()); 
    v.setDrawingCacheEnabled(false); // clear drawing cache 
    return b; 
} 

但它僅包含的項目,我可以正常查看(如預期)。

當我截取屏幕截圖時,有什麼方法可以使RecyclerView以全長魔術般地顯示(一次顯示所有項目)?

如果不是,我該如何解決這個問題?

+0

如果您有很多項目,無論解決方案是否可行,我保證您的內存不足錯誤。 –

回答

7

這裏是我的LinearLayoutManager解決方案時所有項目都在相同的尺寸並有只有一種類型的項目的。該解決方案基於This answer

注意:它可能會導致內存不足錯誤。

public static Bitmap getRecyclerViewScreenshot(RecyclerView view) { 
     int size = view.getAdapter().getItemCount(); 
     RecyclerView.ViewHolder holder = view.getAdapter().createViewHolder(view, 0); 
     view.getAdapter().onBindViewHolder(holder, 0); 
     holder.itemView.measure(View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY), 
       View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
     holder.itemView.layout(0, 0, holder.itemView.getMeasuredWidth(), holder.itemView.getMeasuredHeight()); 
     Bitmap bigBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), holder.itemView.getMeasuredHeight() * size, 
       Bitmap.Config.ARGB_8888); 
     Canvas bigCanvas = new Canvas(bigBitmap); 
     bigCanvas.drawColor(Color.WHITE); 
     Paint paint = new Paint(); 
     int iHeight = 0; 
     holder.itemView.setDrawingCacheEnabled(true); 
     holder.itemView.buildDrawingCache(); 
     bigCanvas.drawBitmap(holder.itemView.getDrawingCache(), 0f, iHeight, paint); 
     holder.itemView.setDrawingCacheEnabled(false); 
     holder.itemView.destroyDrawingCache(); 
     iHeight += holder.itemView.getMeasuredHeight(); 
     for (int i = 1; i < size; i++) { 
      view.getAdapter().onBindViewHolder(holder, i); 
      holder.itemView.setDrawingCacheEnabled(true); 
      holder.itemView.buildDrawingCache(); 
      bigCanvas.drawBitmap(holder.itemView.getDrawingCache(), 0f, iHeight, paint); 
      iHeight += holder.itemView.getMeasuredHeight(); 
      holder.itemView.setDrawingCacheEnabled(false); 
      holder.itemView.destroyDrawingCache(); 
     } 
     return bigBitmap; 
    } 

注2:它最初被寫在科特林。 Here是我使用的原始代碼。

+2

如果不是所有的項目都具有相同的大小,它將要求您保存每個項目的數據,可能在文件中。 –

+1

謝謝!有用! – davis

+0

我的一個textview沒有在屏幕截圖 –

10

靈感來自Yoav的回答。此代碼適用於recyclerview項目類型,可能與其大小無關。

它使用具有linearlayout管理器和三種項目類型的recyclerview進行測試。但要與其他版面管理員一起檢查。

public Bitmap getScreenshotFromRecyclerView(RecyclerView view) { 
     RecyclerView.Adapter adapter = view.getAdapter(); 
     Bitmap bigBitmap = null; 
     if (adapter != null) { 
      int size = adapter.getItemCount(); 
      int height = 0; 
      Paint paint = new Paint(); 
      int iHeight = 0; 
      final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024); 

      // Use 1/8th of the available memory for this memory cache. 
      final int cacheSize = maxMemory/8; 
      LruCache<String, Bitmap> bitmaCache = new LruCache<>(cacheSize); 
      for (int i = 0; i < size; i++) { 
       RecyclerView.ViewHolder holder = adapter.createViewHolder(view, adapter.getItemViewType(i)); 
       adapter.onBindViewHolder(holder, i); 
       holder.itemView.measure(View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY), 
         View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
       holder.itemView.layout(0, 0, holder.itemView.getMeasuredWidth(), holder.itemView.getMeasuredHeight()); 
       holder.itemView.setDrawingCacheEnabled(true); 
       holder.itemView.buildDrawingCache(); 
       Bitmap drawingCache = holder.itemView.getDrawingCache(); 
       if (drawingCache != null) { 

        bitmaCache.put(String.valueOf(i), drawingCache); 
       } 
//    holder.itemView.setDrawingCacheEnabled(false); 
//    holder.itemView.destroyDrawingCache(); 
       height += holder.itemView.getMeasuredHeight(); 
      } 

      bigBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), height, Bitmap.Config.ARGB_8888); 
      Canvas bigCanvas = new Canvas(bigBitmap); 
      bigCanvas.drawColor(Color.WHITE); 

      for (int i = 0; i < size; i++) { 
       Bitmap bitmap = bitmaCache.get(String.valueOf(i)); 
       bigCanvas.drawBitmap(bitmap, 0f, iHeight, paint); 
       iHeight += bitmap.getHeight(); 
       bitmap.recycle(); 
      } 

     } 
     return bigBitmap; 
    } 
+0

非常感謝。你救了我的生命兄弟! –

+0

感謝您的代碼,但imageView沒有得到出口 –

+0

他們非常感謝,還有一點我們可以添加移動框架 – Jasss