Quando si crea un LiveWallpaper in Android 2.2+, si ottiene una tela (o qualsiasi altra cosa l'equivalente 3D) su cui disegnare. Mi piacerebbe disegnare alcuni elementi usando gli strumenti integrati dell'interfaccia utente Android piuttosto che creare tutto da zero usando i comandi canvas o caricando un bitmap UI pre-renderizzato.Utilizzo delle risorse di layout in un LiveWallpaper su Android
La conversione di una singola vista in una bitmap funziona correttamente. cioè funziona perfettamente:
// 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);
Tuttavia, la conversione di un LinearLayout con i bambini causa problemi. È solo ottenere il LinearLayout stesso e nessuno dei suoi figli. Ad esempio, se imposto che LinearLayout abbia uno sfondo bianco, ottengo una casella bianca ben renderizzata, ma nessuno dei bambini di TextView si trova nella bitmap. Ho anche provato a utilizzare DrawingCache con risultati simili.
Il codice che sto usando è l'esempio del cubo con le uniche modifiche che sono un comando extra di disegno. Il LinearLayout funziona bene come un brindisi o come una vista normale (ad esempio, tutto si mostra bene), sul LiveWallpaper tutto ciò che ottengo è lo sfondo di LinearLayout reso.
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);
Qualcuno sa se è necessario fare qualcosa di speciale per far visualizzare correttamente i bambini alla mia bitmap? Devo in qualche modo fare qualcosa di speciale per rendere il layout di rendering il resto dei bambini? Devo scrivere una funzione per fare ricorsivamente qualcosa a tutti i bambini?
Potrei comporre tutto da solo ma, dal momento che il display è abbastanza statico (cioè disegno una volta sola e conservo una copia della bitmap per disegnare sullo sfondo) questo mi sembra più facile e comunque abbastanza efficiente.
Edit: Scavando un po 'più nello stato del layout sembra come se il layout non sta procedendo verso il basso l'albero di vista (cioè il LinearLayout ottiene il suo layout computerizzata quando chiamo il layout(), ma i bambini avere una dimensione nulla (0x0)). Secondo il post di Romain Guy nel 2008 android developer post. Devi aspettare il passaggio del layout o forzare il layout da solo. Il problema è: come posso aspettare un passaggio di layout da un motore di carta da parati per un LinearLayout che non è collegato al gruppo di visualizzazione di root? E come posso impaginare manualmente ogni elemento figlio se il layout richiede di impostare il lato sinistro, superiore, destro, inferiore quando non so che cosa dovrebbero essere.
Ho provato a chiamare forceLayout sui bambini ma non sembra essere d'aiuto. Non sono sicuro di come il framework di layout funzioni dietro le quinte (oltre a un layout a due passaggi). C'è un modo per farlo manualmente passare il layout, cioè adesso? Dal momento che non si tratta di un'attività, non penso che molte delle normali cose di base stiano accadendo nel modo in cui mi piacerebbe.
hai implementato la soluzione proposta?Sto valutando lo stesso approccio, ma vorrei imparare dalle tue esperienze – dparnas