Réglage de l'ImageView ScaleType “centre” ne fonctionne pas comme prévu
J'ai le schéma suivant pour mon ImageView
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants">
<ImageView
android:id="@+id/imageview_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:scaleType="fitCenter" />
(...)
</LinearLayout>
Ceux 48dp
égal à 36px, 48 px et 72px dans ldpi
, mdpi
et hdpi
respectivement. Toutes les images qui seront utilisées dans ce ImageView
sont essentiellement des icônes et j'ai trouvé sur le web ce que je veux pour mon application (licence libre). Mais malheureusement, il ne vient pas avec des images plus grandes que 48 px et en utilisant différentes images est hors de question. J'ai donc besoin d'une nouvelle solution...
Pour l'instant j'ai 36px et 48 px images dans la ldpi
et mdpi
dossiers, respectivement. Mais je vais avoir des ennuis avec hdpi
. Ce que je veux pour les appareils fonctionnant sur hdpi
est pour eux d'utiliser les mdpi
image (plus disponible) et l'utiliser comme il est, sans mise à l'échelle. Fondamentalement, la ImageView
pour hdpi
est 72px, donc je veux la 48 px image à l'intérieur de la 72px, dans le centre, sans mise à l'échelle. Pour cela, j'ai simplement essayé de changer scaleType
dans le ImageView
ci-dessus à juste center
, mais l'image est mis à l'échelle de toute façon.
Mon ultime question ici est, quelle est la bonne manière de résoudre le problème décrit ci-dessus? Comment puis-je avoir ldpi
et mdpi
images utilisées dans leurs densités, mais ont des appareils fonctionnant hdpi
ramasser le plus gros de l'image (ce qui est le mdpi
) et d'empêcher toute mise à l'échelle, juste à côté de l'image dans le centre de la ImageView
?
EDIT:
J'ai répondu à cette question moi-même, mais il pourrait être la réponse d'autres personnes venant ici sont à la recherche pour. Mais je dois donner un aperçu sur ce qui se passe réellement et le problème sous-jacent. Veuillez prendre un coup d'oeil et de fournir une solution de contournement/corriger si vous le pouvez. J'ose vous 🙂
Oui, essayé la plupart des possibilités logiques. Rien n'y fait 🙁
Puis-je vous demander pourquoi vous en avez besoin? Généralement, les gens veulent que sur un écran normal, cinq 64dp icônes doivent toujours occuper toute la largeur de l'écran (qui est 320dp), doit toujours le même aspect quel que soit l'appareil de résolution, y compris les icônes côtés touch (avec en option indépendante de l'appareil de remplissage)
Je ne comprends pas votre question...
J'ai été en utilisant une bibliothèque pour faire débrochable(pour rendre le fond d'une tour) pour mon projet de travail, mais comme je l'ai changé pour ImageView il a parfaitement fonctionné!
OriginalL'auteur Ricardo Amaral | 2011-10-18
Vous devez vous connecter pour publier un commentaire.
Cette question s'avère être une non-question et je m'excuse pour ceux qui nous fonde, en espérant que l'on a accepté la réponse sera ce qu'ils recherchent quand il ne sera pas.
Pour le rendre clair,
scaleType=centerInside
fonctionne comme prévu. C'est, si vous avez une image plus petite que laImageView
lui-même, que cette image ne sera pas mis à l'échelle pour les limites de laImageView
, il restera dans le centre et non mis à l'échelle.Mais pour le dessus de fonctionner comme prévu, le drawable doit être placé dans le
nodpi
dossier. Je comprends que ce n'est pas toujours acceptable. Donc, quand ce drawable doivent être placés dans l'un de la densité des dossiers au lieu de lanodpi
dossier, lescaleType
attribut ne fonctionne que dans des situations spécifiques.Quand il va travailler:
Xdpi
de la densité et deil y a un drawable dans le
Xdpi
densité dossier (iciX
moyens,l
,m
,h
ou mêmexh
).par exemple, avec
hdpi
densité, mais il n'y a pas un drawable dans lehdpi
dossier et le système choisit l'alternative drawable de l'nodpi
dossier (il n'est pas toujours connu le dossier dans lequel il va choisirà partir de).
Lorsqu'il ne fonctionnera pas:
hdpi
la densité, mais il n'y a pas un drawable dans le
hdpi
dossier et lesystème choisit l'alternative drawable de tous les autres de la densité
les dossiers (pas le
nodpi
dossier), le drawable sera réduit à laImageView
limites et lesscaleType
attribut ne sera pas le fairequoi que ce soit.
En conclusion, il n'y a pas de "bonne" réponse à ma question, cela dépend vraiment de ce que vous essayez d'atteindre. La réponse mon question cependant, j'ai juste besoin de faire 2 choses: a) fixer le
ImageView
scaleType
àcenterInside
et b) Double tous un drawable de lamdpi
dossier dans lehdpi
dossier (comme expliqué ci-dessus, lescaleType=centerInside
va le faire fonctionner).Bien sûr, la duplication d'un drawable n'est pas optimale, mais je ne peux pas trouver une autre solution et jusqu'à présent, personne d'autre ne pouvait non plus... Donc, pour le moment, je vais marquer ce un comme acceptée.
Ce serait la meilleure réponse/solution alors?
À mon avis, si l'appareil/l'émulateur est en cours d'exécution dans
hdpi
et il n'y a pas de correspondance drawable dans lehdpi
dossier il convient de choisir le drawable de lamdpi
dossier sans mise à l'échelle, permettant à l'scaleType
attribut à le faire. Ou peut-être forcer le système à aller à lanodpi
dossier si il ne trouve pas de correspondance drawable dans la densité correspondante dossier, qui pourraient aussi une solution.Donc, si quelqu'un peut jamais fournir une solution de contournement/pour résoudre ce problème, qui serait la vraie bonne réponse. Si jamais, il s'agit de cela, je vais changer le statut "accepté".
OriginalL'auteur Ricardo Amaral
Je l'ai résolu de cette façon:
OriginalL'auteur Quintin Balsdon
Dans mon cas, j'étais réglage de l'image en tant que
android:background
. quand je l'ai mis commeandroid:src
, il a travaillé!OriginalL'auteur Rohit Mandiwal
Essayez de laisser de la hdpi dossier, et de le placer dans un drawable-nodpi dossier. Je ne suis pas sûr de ce que la hiérarchie est (si le nodpi serait alors de remplacer la ldpi et mdpi dossiers), mais ce serait mon premier essai.
hdpi
dossier. Je n'ai que 48 px images dans lamdpi
dossier et 36px images dans laldpi
dossier. Je crois que l'image ne soit capté parhdpi
appareils sont ceux dans lamdpi
dossier. Le problème est que l'image est en train d'être mis à l'échelle, quand il ne devrait pas parce que j'ai explicitement dit de ne pas (scaleType = center
).Essayez-le avec le de 48 px image dans le nodpi dossier.
Si je créer une copie de toutes les 48 px images de la
mdpi
dossier dans lenodpi
dossier, cela ne fonctionne toujours pas. Je ne sais pas à partir de laquelle le dossier de l'image soit utilisée dans lehdpi
appareil est ramassé, mais il reste encore des échelles à laImageView
taille. NiscaleType=center
ouscaleType=centerInside
travaillent, lorsqu'ils le devraient.Hmm...eh bien une mauvaise solution serait d'ajouter android:anydensity="false" dans le manifeste, en vertu de
<supports-screens>
. Vous devez ensuite avoir à gérer une nécessaire mise à l'échelle vous-même. Les images sont de taille suffisante pour que la duplication de la mdpi images dans la hdpi dossier serait un problème?Maintenant, j'ai essayé de déplacer tous les 48 px images de la
nodpi
dossier, qui signifie à la fois lahdpi
etmdpi
dossiers sont vides et laldpi
dossier a la 36px images. AvecscaleType=centerInside
,hdpi
appareils fonctionnent très bien, mais surmdpi
appareils, il semble que les images plus petites (à partir de laldpi
dossier) sont utilisés et l'image est mise à l'échelle. J'ai sérieusement ne pas comprendre ce qu'il se passe...OriginalL'auteur kcoppock
Essayez ceci:
Et mettre les images normalement dans le ldpi/mdpi dossiers.
Bien que je ne recommande pas l'utilisation de valeurs de pixel.
ImageView
avoir 72px (l'équivalent pour 48dp surhdpi
) mais je ne veux tout simplement pas l'image à l'échelle pour s'adapter à la taille que si elle arrive à être de plus petite taille (c'est ce que l'scaleType=center
est censé le faire). C'est le problème ici, je ne veux pas de taille fixe.Enrouler ensuite le ImageView à l'intérieur de
<FrameLayout android:layout_width="48dp" android:layout_height="48dp">
. Combien de fois avez-vous besoin? Je ne pense pas que ImageView est conçu en partie le travail de la densité indépendamment de ldpi-mdpi, et partiellement dans hdpi.Pourriez-vous modifier votre réponse avec un exemple complet de cette dernière suggestion s'il vous plaît?
Édité. Bien que de le faire pour toutes les icônes est un peu trop.
Pas ce que j'attend que vous êtes encore forcer les images à pas plus de 48 px et je n'en veux pas. Je veux qu'ils soient de 48 px si vraiment ils sont 48 px, mais si elles sont plus petites, je veux plus petits, quand ils sont plus grands, je veux plus grand (mais pas plus de 48dp, 72px dans hdpi). Peut-être que je ne suis pas à m'expliquer correctement, mais je ne suis pas sûr de savoir comment faire mieux. Pour l'anecdote, j'ai aussi essayé un exemple similaire à la FrameLayout idée, mais sans le 'max' paramètres, l'image reste encore de mise à l'échelle à la taille totale de la FrameLayout.
OriginalL'auteur Daniel Fekete
Essayer avec
OriginalL'auteur Badre
Créer un ImageView:
L'utiliser simplement comme:
OriginalL'auteur Daniel Fekete