Cuando crea un LiveWallpaper en Android 2.2+ obtiene un lienzo (o lo que sea que el equivalente 3D) para dibujar. Me gustaría dibujar algunos elementos utilizando las herramientas integradas de la interfaz de usuario de Android en lugar de construir todo desde cero utilizando comandos canvas o cargando un mapa de bits UI preprocesado.Uso de recursos de diseño en LiveWallpaper en Android
La conversión de una única vista a un mapa de bits funciona bien. es decir, esto funciona muy bien:
// For example this works:
TextView view = new TextView(ctx);
view.layout(0, 0, 200, 100);
view.setText("test");
Bitmap b = Bitmap.createBitmap(200, 100, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
view.draw(tempC);
c.drawBitmap(b, 200, 100, mPaint);
Pero, la conversión de un LinearLayout con los niños causa problemas. Usted solo obtiene el LinearLayout mismo y ninguno de ellos es hijo. Por ejemplo, si configuro LinearLayout para que tenga un fondo blanco, obtendré un cuadro blanco bien renderizado, pero ninguno de los elementos TextView está en el mapa de bits. También intenté usar DrawingCache con resultados similares.
El código que estoy usando es el ejemplo de cubo con los únicos cambios que son un comando extra de dibujo. LinearLayout funciona bien como un brindis o como una vista normal (es decir, todo se muestra bien), en el LiveWallpaper todo lo que obtengo es el fondo de LinearLayout prestado.
inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = (LinearLayout) inflater.inflate(com.example.android.livecubes.R.layout.testLinearLayout, null);
layout.layout(0, 0, 400, 200);
Bitmap b = Bitmap.createBitmap(400, 200, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
layout.draw(tempC);
c.drawBitmap(b, 10, 200, mPaint);
¿Alguien sabe si necesita hacer algo especial para que los niños se reproduzcan correctamente en mi mapa de bits? es decir, ¿tengo que hacer algo especial para que el diseño represente al resto de los niños? ¿Debo escribir una función para hacer algo recursivamente a todos los niños?
Pude componer todo yo solo pero, dado que la pantalla es bastante estática (es decir, dibujo esta vez y guardo una copia del mapa de bits para dibujar en el fondo), esto me parece más fácil y aún bastante eficiente.
Editar: Mientras que cavar un poco más en el estado de la Disposición parece que la disposición no está progresando por el árbol de vista (es decir, el LinearLayout obtiene su diseño computarizada cuando llamo layout() pero los niños tener un tamaño nulo (0x0)). De acuerdo con la publicación de Romain Guy en 2008 android developer post. Tienes que esperar el paso de disposición o forzar el diseño tú mismo. El problema es cómo puedo esperar un paso de diseño de un motor de papel pintado para un LinearLayout que no está conectado al grupo de vistas raíz. ¿Y cómo puedo diseñar manualmente cada elemento secundario si el diseño requiere que configure el izquierdo, el superior, el derecho, el fondo cuando no sé cuáles deberían ser?
He intentado llamar a forceLayout en los niños, pero tampoco parece ser de ayuda. No estoy seguro de cómo funciona el marco de diseño detrás de escena (además de que tiene un diseño de dos pasos). ¿Hay alguna manera de hacerlo manualmente en el pase de diseño, es decir, ahora mismo? Como no es una actividad, no creo que muchas de las cosas de fondo estén sucediendo del modo que me gustaría.
¿implementó la solución propuesta?Estoy evaluando el mismo enfoque, pero me gustaría aprender de sus experiencias – dparnas