Problemas de Android para convertir ViewGroup con niños en mapa de bits
Estoy convirtiendo con éxito un ViewGroup (RelativeLayout) en un mapa de bits usando una lona. Sin embargo, cuando el sorteo sucede, sólo veo el ViewGroup con su fondo dibujable y no sus hijos (dos TextViews) que deben ser establecidos dentro del RelativeLayout usando reglas como FILL_PARENT.
El RelativeLayout se crea utilizando la siguiente función estática:
- Definiendo el orden Z de vistas de RelativeLayout en Android
- Android: configurar el diseño de fondo de forma programática
- ¿Por qué recibo una CircularDependencyException?
- Picasso no conserva la proporción de aspecto al cambiar el tamaño de la imagen
- Ocultar diseño incluido en android
public static RelativeLayout createProgrammeView(Context context, int width, int height, String title, String time) { RelativeLayout.LayoutParams params; // Layout Root View (RelativeLayout) RelativeLayout rlv = new RelativeLayout(context); params = new RelativeLayout.LayoutParams(width, height); rlv.setLayoutParams(params); rlv.setPadding(3, 3, 3, 3); rlv.setBackgroundResource(R.drawable.background); // Layout Title TextView tv = new TextView(context); params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_TOP); params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); tv.setId(R.id.title); tv.setLayoutParams(params); tv.setGravity(Gravity.CENTER_VERTICAL); tv.setSingleLine(true); tv.setEllipsize(TruncateAt.END); tv.setTextColor(Color.parseColor("#fff")); tv.setTextSize(11); tv.setText(title); rlv.addView(tv); // Layout Start Time tv = new TextView(context); params = new RelativeLayout.LayoutParams(16, RelativeLayout.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW, R.id.title); params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); params.setMargins(0, 4, 0, 0); tv.setId(R.id.time); tv.setLayoutParams(params); tv.setGravity(Gravity.CENTER_VERTICAL); tv.setSingleLine(true); tv.setEllipsize(null); tv.setTextColor(Color.parseColor("#fff")); tv.setTextSize(10); tv.setText(time); rlv.addView(tv); } return rlv; }
A continuación, utilizar lo siguiente para convertir el RelativeLayout en un mapa de bits:
public static Bitmap loadBitmapFromView(RelativeLayout v) { Bitmap b = Bitmap.createBitmap(v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.RGB_565); Canvas c = new Canvas(b); v.draw(c); return b; }
Como se esperaba esto me da un bonito mapa de bits en las dimensiones que necesito con el fondo dibujable, pero los niños no están en el mapa de bits. Llamo a estas funciones bastante para construir una imagen grande que luego se dibuja en una vista personalizada en mi actividad.
Este es el bucle que llama a la función estática:
public static void renderViews(final Context context) { largeBitmap = Bitmap.createBitmap(largeWidth, largeHeight, Bitmap.Config.RGB_565); Canvas largeCanvas = new Canvas(largeBitmap); for (int i = 0; i < items.size(); i++) { int leftMargin = ...SOME CALCULATIONS...; RelativeLayout newView = createProgrammeView(context, width, rowHeight, "Title", "21:00"); Bitmap newViewBitmap = loadBitmapFromView(newView); largeCanvas.drawBitmap(newViewBitmap, leftMargin, 0, new Paint()); } myCustomView.invalidate(); }
Mi vista personalizada anula la función onDraw ():
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(largeBitmap, 0, 0, null); }
De lo que puedo ver creo que esto es porque Android no llama a un measure () en el niño Vistas. He intentado llamar manualmente, pero esto no soluciona el problema.
Por lo tanto, supongo que lo que me gustaría saber es, ¿cómo puedo lograr la conversión de un RelativeLayout con los niños en un mapa de bits y obtener Android para medir a los niños para que respeten sus reglas relativas a la disposición.
Muchas gracias a cualquiera que me ayude a resolver esto.
Robar
- Coloque cuatro diseños relativos igual en la pantalla
- Android: Alinear fondo principal + margen inferior
- Android RelativeLayout programmatically set centerInParent
- Equivalente de RelativeLayout en Flutter
- Android RelativeLayout alinear preocupación
- El pie de página sube cuando se muestra el teclado
- Usando un RelativeLayout para dividir verticalmente dos fragmentos uniformemente
- Adición dinámica de vistas a RelativeLayout dentro de ScrollView
El problema es que no midió ni diseñó el contenedor. Debe llamar a v.measure(widthSpec, heightSpec)
y luego v.layout(left, top, right, bottom)
antes de que el dibujo pueda funcionar. El primer método se asegurará de que la vista sepa cuán grande quiere que sea, y el segundo método garantizará que los niños estén posicionados correctamente.
En su caso usted haría:
v.measure(MeasureSpec.makeMeasureSpec(v.getLayoutParams().width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(v.getLayoutParams().height, MeasureSpec.EXACTLY)); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.RGB_565); Canvas c = new Canvas(b); v.draw(c);
También podría ser útil la solución basada en DisplayMetrics
para los Layouts. Para no repetir, mira aquí .
- ActionBarSherlock AndroidManifest.xml y otros archivos que faltan en la importación
- No se puede crear un emulador con Android L (API 20)