41 votes

Créer un NinePatch / NinePatchDrawable en exécution

J'ai une exigence sur mon application Android pièces sur le graphique doit être personnalisable, par l'extraction de nouvelles couleurs et des images à partir du côté serveur. Certaines de ces images sont neuf-patch images.

Je ne peux pas trouver un moyen de créer et d'afficher ces neuf-patch images (qui ont été récupérés sur le réseau).

Le neuf-patch images sont récupérés et conservés dans l'application sous forme d'images. Afin de créer un NinePatchDrawable, vous avez besoin de NinePatch ou le bloc (byte[]) de la NinePatch. Le NinePatch ne peut PAS être chargé à partir de la Ressources, puisque les images n'existe pas dans /res/drawable/. En outre, afin de créer la NinePatch, vous avez besoin de la partie de la NinePatch. Donc, c'est tous les exercices jusqu'à la morceau ... La question est alors, comment faire un format/générer le morceau à partir d'un Bitmap (contenant le NinePatch de l'information)?

J'ai cherché à travers le code source Android et sur le Web et je n'arrive pas à trouver des exemples de cette. Pour aggraver les choses, tous décodage d'un NinePatch les ressources semblent être fait en natif ... =(

Quelqu'un a eu des expériences avec ce genre de problème!? Toute aide est grandement appréciée!!!

Je suis ciblage de l'API de niveau 4, si cela a de l'importance.

Merci à l'avance!

En ce qui concerne, Jacob

56voto

kanzure Points 918

getNinePatchChunk fonctionne très bien. Il a retourné null parce que vous deviez donner un Bitmap "source" ninepatch. Il a besoin d'un "compilé" ninepatch image.

Il existe deux types de ninepatch formats de fichiers dans le monde Android ("source" et "compilé"). La version de la source est l'endroit où vous ajoutez la 1px la transparence de la frontière partout, lorsque vous compilez votre application en .apk plus tard, aapt permettra de convertir vos *.9.png fichiers au format binaire qui Android attend. C'est là le fichier png obtient son "morceau" de métadonnées. (lire en plus)

Bon, maintenant, à l' (vous êtes en train d'écouter DJ kanzure).

  1. Code Client, quelque chose comme ceci:

    InputStream stream = .. //whatever
    Bitmap bitmap = BitmapFactory.decodeStream(stream);
    byte[] chunk = bitmap.getNinePatchChunk();
    boolean result = NinePatch.isNinePatchChunk(chunk);
    NinePatchDrawable patchy = new NinePatchDrawable(bitmap, chunk, new Rect(), null);
    
  2. Côté serveur, vous avez besoin pour préparer vos images. Vous pouvez utiliser l' Android Binaire Compilateur de Ressources. Cela automatise une partie de la douleur à l'écart de la création d'un nouveau projet Android juste pour la compilation de certains *.9.les fichiers png dans le Android format natif. Si vous le faites manuellement, vous serait essentiellement le faire un projet et de le jeter dans certains *.9.png fichiers (les fichiers"sources"), compiler le tout dans la .apk format, décompressez le fichier .apk fichier, puis de trouver l' *.9.fichier png, et c'est celui que vous envoyez à vos clients.

Aussi: je ne sais pas si BitmapFactory.decodeStream sait à propos de la npTc morceau dans ces fichiers png, de sorte qu'il peut ou ne peut pas traiter le flux de l'image correctement. L'existence d' Bitmap.getNinePatchChunk suggère que BitmapFactory peut-on pourrait aller le chercher en amont de la base de code.

Dans le cas où elles ne savent pas à propos de la npTc morceau et vos images sont vissées de manière significative, alors ma réponse change un peu.

Au lieu d'envoyer l'compilé ninepatch images pour le client, vous écrivez une rapide application Android pour charger compilé des images et cracher l' byte[] bloc. Ensuite, vous transmettre ce tableau d'octets à vos clients avec une image régulière-pas de bordures transparentes, non pas la "source" ninepatch de l'image, pas le "compilé" ninepatch image. Vous pouvez utiliser directement le morceau pour créer votre objet.

Une autre alternative consiste à utiliser la sérialisation d'un objet à envoyer ninepatch images (NinePatch) à vos clients, comme JSON ou le haut-sérialiseur.

Modifier Si vous avez vraiment, vraiment besoin pour construire votre propre morceau de tableau d'octets, je voudrais commencer en regardant do_9patch, isNinePatchChunk, Res_png_9patch et Res_png_9patch::serialize() dans ResourceTypes.cpp. Il y a également une maison npTc morceau lecteur de Dmitry Skiba. Je ne peux pas poster de liens, donc si quelqu'un peut éditer ma réponse ça serait cool.

do_9patch: http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=tools/aapt/Images.cpp;h=3c471ca76107cc49b5f8e3ca15e87725ed80faf9;hb=refs/heads/gingerbread

isNinePatchChunk: http://netmite.com/android/mydroid/1.6/frameworks/base/core/jni/android/graphics/NinePatch.cpp

struct Res_png_9patch: https://scm.sipfoundry.org/rep/sipX/main/sipXmediaLib/contrib/android/android_2_0_headers/frameworks/base/include/utils/ResourceTypes.h

Dmitry Skiba trucs: http://code.google.com/p/android4me/source/browse/src/android/graphics/Bitmap.java

25voto

Brian Griffey Points 3362

Si vous avez besoin de créer 9Patches à la volée, jetez un œil à l’essentiel de mon travail: https://gist.github.com/4391807

Vous transmettez une image bitmap, puis lui donnez des encoches similaires à iOS.

6voto

figofuture Points 71

pas besoin d'utiliser le compilateur de ressources binaires Android pour préparer les pngs compilés en 9patch, il est correct d'utiliser aapt dans android-sdk, la ligne de commande est la suivante: aapt.exe c -v -S / chemin / vers / projet -C / chemin / vers / destination

4voto

mreichelt Points 6217

Vous voulez donc créer un NinePatchDrawable sur demande, n'est-ce pas? J'ai essayé le code suivant, peut-être que cela fonctionne pour vous:

 InputStream in = getResources().openRawResource(R.raw.test);
Drawable d = NinePatchDrawable.createFromStream(in, null);
System.out.println(d.getMinimumHeight() + ":" + d.getMinimumHeight());
 

Je pense que cela devrait fonctionner. Il vous suffit de modifier la première ligne pour extraire InputStream du Web. getNinePatchChunk() n'est pas destiné à être appelé par les développeurs conformément à la documentation et pourrait ne plus fonctionner correctement.

0voto

FoamyGuy Points 26600

La classe Bitmap fournit une méthode pour cela. Yourbitmap.getNinePatchChunk (). Je ne l'ai jamais utilisé, mais il semble que ce que vous recherchiez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X