AImageView (composant Android)
20 Oct 2014Pour afficher une image sur Android, le SDK contient un composant
ImageView
.
Cependant, son mécanisme de configuration du redimensionnement de l’image
(ScaleType
) me semble déficient :
- il ne gère pas tous les cas courants ;
- le choix de la bonne constante (si elle existe) n’est pas toujours très intuitif.
J’ai donc écrit un composant AImageView
(qui hérite d’ImageView
) avec un
mécanisme alternatif au scale type.
Principes
AImageView
propose 4 paramètres :
xWeight
etyWeight
(desfloat
s entre0
et1
) indiquent à quel endroit lier l’image au conteneur ;fit
indique si l’image doit s’adapter à l’intérieur du composant (en ajoutant des marges), à l’extérieur du composant (en croppant), toujours horizontalement ou toujours verticalement.scale
indique si l’on accepte de downscaler (réduire) et/ou d’upscaler (agrandir) l’image ;
Actuellement, il préserve toujours le format d’image (aspect ratio).
Exemple d’utilisation
Ici, l’image va s’adapter à l’intérieur (inside
) du composant (des marges
seront ajoutées si nécessaires), exactement (l’image peut être réduite
– downscale
– ou agrandie – upscale
– pour s’adapter) et sera centrée
(0.5
, 0.5
).
Équivalences des scale types
Les constantes de ScaleType
du composant standard ImageView
correspondent en fait à des valeurs particulières de ces paramètres. Comme vous
pourrez le constater, elles ne couvrent pas toutes les combinaisons, et ne sont
pas toujours explicites…
ScaleType.CENTER
ScaleType.CENTER_CROP
ScaleType.CENTER_INSIDE
ScaleType.FIT_CENTER
ScaleType.FIT_END
ScaleType.FIT_START
ScaleType.FIT_XY
Cette configuration ne peut pas être reproduite en utilisant les paramètres
d’AImageView
, car ce composant préserve toujours l’aspect ratio.
ScaleType.MATRIX
AImageView
hérite d’ImageView
et force le scaleType
à ScaleType.MATRIX
(pour redimensionner et déplacer l’image). Par conséquent, il n’y a pas
d’équivalent, AImageView
est basé dessus.
Composant
Le composant est disponible sous la forme d’un project library (sous licence
GNU/LGPLv3 (plus maintenant) MIT):
AImageView.
Vous pouvez le compiler en fichier .aar
grâce à la commande :
Il sera généré dans library/build/outputs/aar/aimageview.aar
.
J’ai aussi écrit une application de démo l’utilisant (avec tous les fichiers Gradle qui-vont-bien) : AImageViewSample.
Pour compiler un apk
de debug (par exemple) :
Pour ceux que le code intéresse, la classe principale est
AImageView
. Pour l’utiliser, la partie importante est dans
activity_main.xml
.
N’hésitez pas à critiquer ou à remonter des bugs.