studio programacion herramientas fundamentos con avanzado aplicaciones android bitmap

programacion - manual de android en pdf



¿Convertir una vista a mapa de bits sin mostrarlo en Android? (6)

Espero que esto ayude

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

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 las 3 pantallas de mapa de bits deben mostrarse en la vista de 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 mapa de bits 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 mapa de bits 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.


Prueba esto,

/** * Draw the view into a bitmap. */ private 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 mapa de bits 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


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 :)


hay una forma de hacer esto. tienes que crear un mapa de bits y un lienzo 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();


view.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); view.setDrawingCacheEnabled(false);