Sur une mise en page, je souhaite redimensionner l'image d'arrière-plan (en conservant son rapport hauteur / largeur) à l'espace alloué lors de la création de la page. Quelqu'un a-t-il une idée de la façon de procéder?
J'utilise layout.setBackgroundDrawable()
et un BitmapDrawable()
pour définir gravity
pour le découpage et le remplissage, mais je ne vois aucune option pour la mise à l'échelle.
Réponses:
Pour personnaliser la mise à l'échelle de l'image d'arrière-plan, créez une ressource comme celle-ci:
Ensuite, il sera centré dans la vue s'il est utilisé comme arrière-plan. Il existe également d'autres drapeaux: http://developer.android.com/guide/topics/resources/drawable-resource.html
la source
Je n'ai pas essayé de faire exactement ce que vous voulez, mais vous pouvez mettre à l'échelle un ImageView à l'aide de
android:scaleType="fitXY"
et il sera dimensionné pour s'adapter à la taille que vous donnez à ImageView.
Vous pouvez donc créer un FrameLayout pour votre mise en page, y placer ImageView, puis tout autre contenu dont vous avez besoin dans le FrameLayout avec un arrière-plan transparent.
la source
Il existe un moyen simple de le faire à partir du dessinable:
your_drawable.xml
Le seul inconvénient est que s'il n'y a pas assez d'espace, votre image ne sera pas entièrement affichée, mais elle sera coupée, je n'ai pas trouvé de moyen de le faire directement à partir d'un dessinable. Mais d'après les tests que j'ai effectués, cela fonctionne plutôt bien et ne coupe pas beaucoup l'image. Vous pourriez jouer plus avec les options de gravité.
Une autre façon sera de simplement créer une mise en page, où vous utiliserez un
ImageView
et définissez lescaleType
surfitCenter
.la source
error: <item> must have a 'name' attribute.
Pour conserver le rapport hauteur / largeur, vous devez utiliser
android:scaleType=fitCenter
oufitStart
etc. L'utilisationfitXY
ne conservera pas le rapport hauteur / largeur original de l'image!Notez que cela ne fonctionne que pour les images avec un
src
attribut, pas pour l'image d'arrière-plan.la source
Utilisez l'image comme arrière-plan dimensionné pour la mise en page:
la source
android:scaleType="centerCrop"
.Lorsque vous définissez le Drawable d'un ImageView à l'aide de la
setBackgroundDrawable
méthode, l'image sera toujours mise à l'échelle. Les paramètres tels queadjustViewBounds
ou différentsScaleTypes
seront simplement ignorés. La seule solution pour conserver le rapport hauteur / largeur que j'ai trouvé est de redimensionner leImageView
fichier après le chargement de votre dessin. Voici l'extrait de code que j'ai utilisé:Dans l'extrait de code ci-dessus se trouve bmp l'objet Bitmap qui doit être affiché et imageView est l'
ImageView
objetUne chose importante à noter est le changement des paramètres de mise en page . Ceci est nécessaire car
setMaxHeight
etsetMaxWidth
ne fera une différence que si la largeur et la hauteur sont définies pour envelopper le contenu, et non pour remplir le parent. Par contre, Fill parent est le paramètre souhaité au début, car sinon,containerWidth
etcontainerHeight
les deux auront des valeurs égales à 0. Ainsi, dans votre fichier de mise en page, vous aurez quelque chose comme ceci pour votre ImageView:la source
Ce n'est pas la solution la plus performante, mais comme quelqu'un l'a suggéré à la place de l'arrière-plan, vous pouvez créer FrameLayout ou RelativeLayout et utiliser ImageView comme pseudo arrière-plan - d'autres éléments seront positionnés simplement au-dessus:
Le problème avec ImageView est que seuls les scaleTypes disponibles sont: CENTER, CENTER_CROP, CENTER_INSIDE, FIT_CENTER, FIT_END, FIT_START, FIT_XY, MATRIX ( http://etcodehome.blogspot.de/2011/05/android-imageview-scaletype-samples.html )
et pour "redimensionner l'image d'arrière-plan (en conservant son rapport hauteur / largeur)" dans certains cas, lorsque vous voulez qu'une image remplisse tout l'écran (par exemple l'image d'arrière-plan) et que le rapport hauteur / largeur de l'écran est différent de celui de l'image, le scaleType nécessaire est gentil de TOP_CROP, car:
CENTER_CROP centre l'image mise à l'échelle au lieu d'aligner le bord supérieur sur le bord supérieur de la vue d'image et FIT_START s'adapte à la hauteur de l'écran et ne remplit pas la largeur. Et comme l'utilisateur Anke l'a remarqué, FIT_XY ne conserve pas les proportions.
Heureusement, quelqu'un a étendu ImageView pour prendre en charge TOP_CROP
https://stackoverflow.com/a/14815588/2075875
Maintenant, IMHO serait parfait si quelqu'un écrivait Drawable personnalisé qui redimensionnait l'image comme ça. Ensuite, il pourrait être utilisé comme paramètre d'arrière-plan.
Reflog suggère de mettre à l'échelle le dessinable avant de l'utiliser. Voici les instructions pour le faire: Java (Android): Comment mettre à l'échelle un dessinable sans Bitmap? Bien que cela présente un inconvénient, ce dessin / bitmap mis à l'échelle utilisera plus de RAM, tandis que la mise à l'échelle à la volée utilisée par ImageView ne nécessite pas plus de mémoire. L'avantage pourrait être une charge de processeur moindre.
la source
Le code ci-dessous rend le bitmap parfaitement avec la même taille de l'image vue. Obtenez la hauteur et la largeur de l'image bitmap, puis calculez la nouvelle hauteur et la largeur à l'aide des paramètres d'imageview. Cela vous donne l'image requise avec le meilleur rapport hauteur / largeur.
la source
Ce que Dweebo a proposé fonctionne. Mais à mon humble avis, ce n'est pas nécessaire. Un fond dessinable s'échelonne bien tout seul. La vue doit avoir une largeur et une hauteur fixes, comme dans l'exemple suivant:
la source
Une option à essayer consiste à placer l'image dans le
drawable-nodpi
dossier et à définir l'arrière-plan d'une mise en page sur l'ID de ressource pouvant être dessiné.Cela fonctionne certainement avec la réduction, mais je n'ai pas testé avec la mise à l'échelle.
la source
Kotlin:
Si vous aviez besoin de dessiner un bitmap dans une vue, mis à l'échelle à FIT.
Vous pouvez effectuer les calculs appropriés pour définir bm la hauteur égale au conteneur et ajuster la largeur, dans le cas où le rapport largeur / hauteur bm est inférieur au rapport largeur / hauteur du conteneur, ou l'inverse dans le scénario opposé.
Images:
la source
vous devrez pré-mettre à l'échelle ce dessinable avant de l'utiliser comme arrière-plan
la source
Vous pouvez utiliser l'un des éléments suivants:
android: gravité = "fill_horizontal | clip_vertical"
Ou
android: gravité = "fill_vertical | clip_horizontal"
la source