Lorsque vous créez un LiveWallpaper sous Android 2.2+, vous obtenez un canevas (ou l'équivalent 3D) sur lequel dessiner. Je voudrais dessiner certains éléments en utilisant les outils intégrés de l'interface utilisateur Android plutôt que de tout construire à partir de zéro en utilisant des commandes de canevas ou en chargeant une image bitmap d'interface utilisateur pré-rendue.Utilisation des ressources de mise en page dans un LiveWallpaper sur Android
La conversion d'une seule vue en bitmap fonctionne correctement. c'est-à-dire que cela fonctionne 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);
Mais, la conversion d'un LinearLayout avec des enfants pose des problèmes. Vous seulement obtenir le LinearLayout lui-même et aucun de ses enfants. Par exemple, si je mets le LinearLayout à un fond blanc, je reçois une boîte blanche bien rendue, mais aucun des enfants TextView n'est dans le Bitmap. J'ai également essayé d'utiliser DrawingCache avec des résultats similaires.
Le code que j'utilise est l'exemple de cube avec les seules modifications étant une commande de dessin supplémentaire. Le LinearLayout fonctionne bien comme un toast ou comme une vue régulière (c'est-à-dire que tout se montre bien), sur le LiveWallpaper, tout ce que j'ai, c'est l'arrière-plan de LinearLayout.
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);
Est-ce que quelqu'un sait si vous avez besoin de faire quelque chose de spécial pour que les enfants soient rendus correctement à mon bitmap? c'est-à-dire que dois-je faire quelque chose de spécial pour que la mise en page rende le reste des enfants? Devrais-je écrire une fonction pour faire récursivement quelque chose à tous les enfants?
Je pourrais tout composer moi-même mais, comme l'affichage est assez statique (je dessine une fois et garde une copie de l'image pour dessiner en arrière-plan), cela me semble plus facile et efficace.
Edit: En creusant un peu plus dans l'état de la mise en page il semble que la mise en page ne progresse pas dans l'arbre de vue (la LinearLayout obtient sa mise en page calculée quand je l'appelle la mise en page() mais les enfants avoir une taille nulle (0x0)). Selon le message de Romain Guy en 2008 android developer post. Vous devez attendre le passage de mise en page ou forcer la mise en page vous-même. Le problème est comment puis-je attendre un passage de disposition d'un moteur de papier peint pour un LinearLayout qui n'est pas attaché au groupe de vue racine? Et comment puis-je mettre en page manuellement chaque élément enfant si la mise en page nécessite que vous définissiez la gauche, le haut, la droite, le bas lorsque je ne sais pas ce que cela devrait être.
J'ai essayé d'appeler forceLayout sur les enfants mais cela ne semble pas aider non plus. Je ne suis pas sûr de la façon dont le cadre de mise en page fonctionne dans les coulisses (en plus de cela il fait une mise en page en deux passes). Y a-t-il un moyen de faire manuellement passer la mise en page, c'est-à-dire maintenant? Puisque ce n'est pas une activité, je ne pense pas que beaucoup de choses se passent comme je le souhaite.
avez-vous mis en œuvre la solution proposée?J'évalue la même approche, mais je voudrais apprendre de vos expériences – dparnas