¿Convertir una vista a bitmap sin mostrarlo en Android?

Trataré de explicar qué es exactamente lo que necesito hacer.

Tengo 3 pantallas separadas, dicen A, B, C. Hay otra pantalla llamada decir HomeScreen donde se mostrarán las 3 pantallas de bitmap en la vista Galería y el usuario puede seleccionar a qué vista quiere ir.

Pude obtener los mapas de bits de las 3 pantallas y mostrarlo en la vista de la galería colocando todo el código en la actividad de la pantalla de inicio solamente. Ahora, esto ha complicado mucho el código y me gustaría simplificarlo.

Entonces, ¿puedo llamar a otra actividad desde HomeScreen y no mostrarla y obtener el bitmap de esa pantalla? Por ejemplo, digamos que solo llamo a HomeScreen y se llama Actividad A, B, C y no se muestra ninguna de las Actividades de A, B, C. Simplemente da el bitmap de esa pantalla mediante getDrawingCache (). Y luego podemos mostrar esos mapas de bits en la vista de Galería en HomeScreen.

Espero haber explicado el problema muy claramente.

Por favor, avíseme si esto es realmente posible.

hay una forma de hacer esto. tienes que crear un bitmap y un canvas y llamar a view.draw (canvas);

aquí está el código:

public static Bitmap loadBitmapFromView(View v) { Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom()); v.draw(c); return b; } 

si la vista no se mostró antes, el tamaño será cero. Es posible medirlo así:

 if (v.getMeasuredHeight() <= 0) { v.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); v.draw(c); return b; } 

EDITAR: según esta publicación , pasar WRAP_CONTENT como valor a makeMeasureSpec() no sirve de nada (aunque para algunas clases de vista sí funciona), y el método recomendado es:

 // Either this int specWidth = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.AT_MOST); // Or this int specWidth = MeasureSpec.makeMeasureSpec(0 /* any */, MeasureSpec.UNSPECIFIED); view.measure(specWidth, specWidth); int questionWidth = view.getMeasuredWidth(); 

aquí está mi solución:

 public static Bitmap getBitmapFromView(View view) { Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(returnedBitmap); Drawable bgDrawable =view.getBackground(); if (bgDrawable!=null) bgDrawable.draw(canvas); else canvas.drawColor(Color.WHITE); view.draw(canvas); return returnedBitmap; } 

Disfruta 🙂

Prueba esto,

  /** * Draw the view into a bitmap. */ public static Bitmap getViewBitmap(View v) { v.clearFocus(); v.setPressed(false); boolean willNotCache = v.willNotCacheDrawing(); v.setWillNotCacheDrawing(false); // Reset the drawing cache background color to fully transparent // for the duration of this operation int color = v.getDrawingCacheBackgroundColor(); v.setDrawingCacheBackgroundColor(0); if (color != 0) { v.destroyDrawingCache(); } v.buildDrawingCache(); Bitmap cacheBitmap = v.getDrawingCache(); if (cacheBitmap == null) { Log.e(TAG, "failed getViewBitmap(" + v + ")", new RuntimeException()); return null; } Bitmap bitmap = Bitmap.createBitmap(cacheBitmap); // Restore the view v.destroyDrawingCache(); v.setWillNotCacheDrawing(willNotCache); v.setDrawingCacheBackgroundColor(color); return bitmap; } 

Sé que esto puede ser un problema obsoleto, pero estaba teniendo problemas para lograr que alguna de estas soluciones funcione para mí. Específicamente, descubrí que si se realizaban cambios en la vista después de que se infló, esos cambios no se incorporarían al bitmap procesado.

Este es el método que terminó trabajando para mi caso. Con una advertencia, sin embargo. antes de llamar a getViewBitmap(View) mi vista y le pedí que getViewBitmap(View) con las dimensiones conocidas. Esto era necesario ya que el diseño de mi vista lo convertiría en altura / ancho cero hasta que el contenido se colocara dentro.

 View view = LayoutInflater.from(context).inflate(layoutID, null); //Do some stuff to the view, like add an ImageView, etc. view.layout(0, 0, width, height); Bitmap getViewBitmap(View view) { //Get the dimensions of the view so we can re-layout the view at its current size //and create a bitmap of the same size int width = view.getWidth(); int height = view.getHeight(); int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY); int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY); //Cause the view to re-layout view.measure(measuredWidth, measuredHeight); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); //Create a bitmap backed Canvas to draw the view into Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); //Now that the view is laid out and we have a canvas, ask the view to draw itself into the canvas view.draw(c); return b; } 

La “salsa mágica” para mí se encontró aquí: https://groups.google.com/forum/#!topic/android-developers/BxIBAOeTA1Q

Aclamaciones,

Levi

Espero que esto ayude

 View view="some view instance"; view.setDrawingCacheEnabled(true); Bitmap bitmap=view.getDrawingCache(); view.setDrawingCacheEnabled(false); 
 view.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); view.setDrawingCacheEnabled(false);