2015-05-06 5 views
5

Ich möchte eine "vollständige Seite" Screenshot der Aktivität erhalten. Die Ansicht enthält eine RecyclerView mit vielen Elementen.Machen Sie einen Screenshot von RecyclerView in voller Länge

Ich kann mit dieser Funktion einen Screenshot der aktuellen Ansicht nehmen:

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

Aber es enthält nur die Elemente, die ich normalerweise sehen kann (wie erwartet).

Gibt es einen Weg, um den RecyclerView magisch in voller Länge (Anzeige aller Elemente auf einmal) zu zeigen, wenn ich den Screenshot mache?

Wenn nicht, wie soll ich dieses Problem angehen?

+0

Wenn Sie viele Elemente haben, egal ob eine Lösung möglich ist, garantiere ich Ihnen einen Speichermangel. –

Antwort

7

Hier ist meine Lösung für LinearLayoutManager wenn alle Elemente auf der gleichen Größe sind und es gibt nur eine Art von Artikel. Diese Lösung basiert auf This answer.

Hinweis: Es kann möglicherweise zu einem Speicherfehler führen.

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

Anmerkung 2: Es wurde ursprünglich in Kotlin geschrieben. Here ist der ursprüngliche von mir verwendete Code.

+2

Wenn Sie sicherstellen, dass nicht alle Elemente die gleiche Größe haben, müssen Sie die Daten für jedes Element speichern, wahrscheinlich für eine Datei. –

+1

Danke! Es klappt! – davis

+0

Meine one textview kommt nicht in Screenshot –

10

Inspiriert von Yoavs Antwort. Dieser Code funktioniert für Recyclerview-Elementtypen und wahrscheinlich unabhängig von seiner Größe.

Es wurde mit einer Recyclerview mit linearen Layout-Manager und drei Elementtypen getestet. Aber um es mit anderen Layout-Managern zu überprüfen.

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

Vielen Dank. Du hast mein Leben gerettet, Bruder! –

+0

Danke für den Code, aber imageView wird nicht exportiert –

+0

sie sehr vielen Dank, ein weiterer Punkt können wir mobile Rahmen damit hinzufügen – Jasss

Verwandte Themen