╔══════════════════════════════════════════════╗ ^
║ ImageView ╔══════════════╗ ║ |
║ ║ ║ ║ |
║ ║ Actual image ║ ║ |
║ ║ ║ ║ |60px height of ImageView
║ ║ ║ ║ |
║ ║ ║ ║ |
║ ╚══════════════╝ ║ |
╚══════════════════════════════════════════════╝
<------------------------------------------------>
90px width of ImageView
J'ai une vue d'image avec une hauteur et une largeur par défaut, les images sont stockées dans la base de données et je veux redimensionner l'image en fonction de la largeur de l'image Imageview. Comme je ne veux pas qu'il donne des valeurs par défaut parce que chaque fois que je change sa hauteur et sa largeur, je dois aussi le changer dans le code.
J'essaie d'obtenir la hauteur et la largeur de ImageView mais 0 me est renvoyé dans les deux cas.
int height = ((ImageView) v.findViewById(R.id.img_ItemView)).getHeight();
cela me retourne 0 même il a la hauteur et la largeur par défaut
Ma réponse sur cette question pourrait vous aider:
int finalHeight, finalWidth;
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
final TextView tv = (TextView)findViewById(R.id.size_label);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
iv.getViewTreeObserver().removeOnPreDrawListener(this);
finalHeight = iv.getMeasuredHeight();
finalWidth = iv.getMeasuredWidth();
tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
return true;
}
});
Vous pouvez ensuite ajouter votre travail de mise à l'échelle d'image à partir de la méthode onPreDraw ().
Je viens de définir cette propriété et maintenant Android le système d'exploitation prend soin de tout.
Android: adjustViewBounds = "true"
Utilisez ceci dans votre layout.xml où vous avez planté votre ImageView: D
Je pourrais obtenir la largeur et la hauteur de l'image par son dessinable;
int width = imgView.getDrawable().getIntrinsicWidth();
int height = imgView.getDrawable().getIntrinsicHeight();
Si les dimensions de l'ImageView sont égales à 0, c'est parce que lorsque vous les interrogez, la vue n'a toujours pas effectué les étapes de disposition et de mesure. Vous avez seulement dit à la vue comment elle se "comporterait" dans la présentation, mais elle ne calculait toujours pas où placer chaque vue.
Comment décidez-vous de la taille à donner à la vue image? Ne pouvez-vous pas simplement utiliser l'une des options de dimensionnement mises en œuvre de manière native?
Poster sur le fil de l'interface utilisateur fonctionne pour moi.
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
iv.post(new Runnable() {
@Override
public void run() {
int width = iv.getMeasuredWidth();
int height = iv.getMeasuredHeight();
}
});
votre fichier xml:
<ImageView Android:id="@+id/imageView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/image"
Android:scaleType="fitXY"
Android:adjustViewBounds="true"/>
votre fichier Java:
ImageView imageView = (ImageView)findViewById(R.id.imageView);
int width = imageView.getDrawable().getIntrinsicWidth();
int height = imageView.getDrawable().getIntrinsicHeight();
La méthode la plus simple consiste à obtenir la largeur et la hauteur d'un ImageView dans la méthode onWindowFocusChanged de l'activité.
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
height = mImageView.getHeight();
width = mImageView.getWidth();
}
Je pense que vous pouvez laisser le système d'exploitation Android se charger de cela pour vous. Définissez le type d’échelle dans ImageView sur fitXY
et l’image qu’elle affiche sera redimensionnée pour correspondre à la taille actuelle de la vue.
<ImageView
Android:layout_width="90px"
Android:layout_height="60px"
Android:scaleType="fitXY" />
Si vous avez créé plusieurs images dynamiquement, essayez celui-ci:
// initialiser votre tableau d'images
private ImageView myImages[] = new ImageView[your_array_length];
// créer par programme et ajouter à la vue parent
for (int i = 0; i < your_array_length; i++) {
myImages[i] = new ImageView(this);
myImages[i].setId(i + 1);
myImages[i].setBackgroundResource(your_array[i]);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
frontWidth[i], frontHeight[i]);
((MarginLayoutParams) params).setMargins(frontX_axis[i],
frontY_axis[i], 0, 0);
myImages[i].setAdjustViewBounds(true);
myImages[i].setLayoutParams(params);
if (getIntent() != null && i != your_array,length) {
final int j = i;
myImages[j].getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
myImages[j].getViewTreeObserver().removeOnPreDrawListener(this);
finalHeight = myImages[j].getMeasuredHeight();
finalWidth = myImages[j].getMeasuredWidth();
your_textview.setText("Height: " + finalHeight + " Width: " + finalWidth);
return true;
}
});
}
your_parent_layout.addView(myImages[i], params);
}
// C'est ça. Bonne codage.