Définir la largeur et la hauteur d'ImageView par programme?

643

Comment puis-je définir ImageViewla largeur et la hauteur d'un par programmation?

praveenb
la source
4
Aussi étrange que cela puisse paraître, cette information est assez difficile à trouver. La question mérite plus de votes positifs.
phunehehe
14
Note de bas de page pour toute personne aux prises avec un problème provenant d'une autre plateforme. l' option "taille et forme pour s'adapter" est magnifiquement gérée dans Android; mais c'est difficile à trouver. vous voulez généralement que le parent de correspondance de largeur, le contenu d' habillage de hauteur, la fonction adjustViewBounds soient activés , l'échelle fitToCenter et cropToPadding false . alors c'est automatique. J'espère vraiment que cela aide quelqu'un!
Fattie

Réponses:

1101

Il peut être trop tard mais pour le bien des autres qui ont le même problème, pour régler la hauteur de l'ImageView:

imageView.getLayoutParams().height = 20;

J'espère que cela t'aides.

Important. Si vous définissez la hauteur après que la mise en page a déjà été «mise en page», assurez-vous d'appeler également:

imageView.requestLayout();
Hakem Zaied
la source
102
Si vous définissez la hauteur après que la mise en page a déjà été «mise en page», assurez-vous d'appeler image_view.requestLayout ()
Rhys Davis
9
et si j'ai besoin de wrap_content?
Francisco Corrales Morales du
8
Votez parce qu'un jour vous étiez mon patron et j'apprends encore de vous Hakim :)
Sami Eltamawy
9
@FranciscoCorralesMorales utilise ceci pour wrap_content image_view.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT.. Si le parent de vue est LinearLayoutremplacé RelativeLayoutpar
Sami Eltamawy
39
Alors, comment spécifier l' unité ? Comment dire que c'est dp , pas sp , etc.
Saeed Neamati
231

Si votre vue d'image est dynamique, la réponse contenant getLayout échouera avec une exception nulle.

Dans ce cas, la bonne façon est:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100, 100);
iv.setLayoutParams(layoutParams);
InvulgoSoft
la source
7
si je mets ce code mon image disparaît. Pourquoi? ImageView imgLogo = new ImageView (this); imgLogo.setImageDrawable (logo); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (32, 32); imgLogo.setLayoutParams (layoutParams); row.addView (imgLogo);
Mustafa Güven
3
Merci pour cette réponse, mettez-moi sur la bonne voie. En tant que note ajoutée, LinearLayout doit être défini sur le type de vue parent de l'image. Par exemple, si votre vue d'image se trouve dans une galerie, vous devez utiliser les paramètres de disposition de la galerie au lieu de LinearLayout ou vous aurez des exceptions de transtypage.
profexorgeek
3
@ MustafaGüven J'ai eu le même problème que vous, où mon ImageViewdisparaît. L'astuce consiste à faire en sorte que la partie mise en page (c'est-à-dire <this_part_here>.LayoutParams) soit la même que celle du parent de l' élément ImageView. Ainsi, par exemple, si vous avez placé votre ImageViewdans un TableRowdans un TableLayout, vous devriez l'avoir comme TableRow.LayoutParams.
user2323030
pour élaborer sur l'utilisateur ($ some_number) -> vous devez créer les LayoutParams en fonction du parent et les définir sur l'enfant (l'imageView), aussi requestLayout () ne semble pas nécessaire au moment de l'écriture
Bamboomy
lol vous créez de nouveaux paramètres, mauvaise réponse, vous pouvez simplement obtenir les paramètres actuels, je veux dire si vous le faites (créez-en de nouveaux) alors vous n'avez même pas besoin de xml, puis créez / ajoutez également imageview par programmation ...
user924
52

Cette façon simple de faire votre tâche:

setContentView(R.id.main);    
ImageView iv = (ImageView) findViewById(R.id.left);
int width = 60;
int height = 60;
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width,height);
iv.setLayoutParams(parms);

et d'une autre manière si vous voulez donner une taille d'écran en hauteur et en largeur, utilisez le code ci-dessous:

setContentView(R.id.main);    
Display display = getWindowManager().getDefaultDisplay();
ImageView iv = (LinearLayout) findViewById(R.id.left);
int width = display.getWidth(); // ((display.getWidth()*20)/100)
int height = display.getHeight();// ((display.getHeight()*30)/100)
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width,height);
iv.setLayoutParams(parms);

j'espère vous en servir pleinement.

duggu
la source
C'est du bon travail pour moi !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Affichage display = getWindowManager (). GetDefaultDisplay (); ImageView iv = (LinearLayout) findViewById (R.id.left); int width = display.getWidth (); // ((display.getWidth () * 20) / 100) int height = display.getHeight (); // ((display.getHeight () * 30) / 100) LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams (width) ,la taille); iv.setLayoutParams (parms);
Selim Raza
Pourquoi les gens déclarent int-ils des variables si elles ne seront pas réutilisées ailleurs? Semble inutile mais je ne sais pas grand-chose à ce sujet.
n00dles
1
juste pour une meilleure compréhension @ n00dles ,,, rien d'autre
duggu
36

J'ai joué celui-ci avec pixelet dp.

private int dimensionInPixel = 200;

Comment définir par pixel :

view.getLayoutParams().height = dimensionInPixel;
view.getLayoutParams().width = dimensionInPixel;
view.requestLayout();

Comment définir par dp :

int dimensionInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dimensionInPixel, getResources().getDisplayMetrics());
view.getLayoutParams().height = dimensionInDp;
view.getLayoutParams().width = dimensionInDp;
view.requestLayout();

J'espère que cela vous aidera.

Hiren Patel
la source
1
Comment pourrais-je le faire pour une valeur dp spécifique (c'est-à-dire ne pas convertir de px en dp)?
alxcyl
@Hiren ce que signifie getResources (). GetDisplayMetrics () quand je lis le document, il semble que ce soit DisplayMetrics. Pouvez-vous m'expliquer brièvement? Je suis nouveau sur Android, merci.
Srini
Causée par: java.lang.NullPointerException: tentative d'écriture dans le champ 'int android.view.ViewGroup $ LayoutParams.height' sur une référence d'objet nul
MD Khali
16

Si vous devez définir votre largeur ou hauteur sur match_parent(aussi grand que son parent) ou wrap_content(assez grand pour s'adapter à son propre contenu interne), alors ViewGroup.LayoutParamsa ces deux constantes:

imageView.setLayoutParams(
    new ViewGroup.LayoutParams(
        // or ViewGroup.LayoutParams.WRAP_CONTENT
        ViewGroup.LayoutParams.MATCH_PARENT,      
        // or ViewGroup.LayoutParams.WRAP_CONTENT,     
        ViewGroup.LayoutParams.MATCH_PARENT ) );

Ou vous pouvez les définir comme dans la réponse de Hakem Zaied :

imageView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
//...
Omar
la source
11

Vous pouvez définir une valeur pour tous les cas.

demoImage.getLayoutParams().height = 150;

demoImage.getLayoutParams().width = 150;

demoImage.setScaleType(ImageView.ScaleType.FIT_XY);
tienanhcntt2
la source
1
Causé par: java.lang.NullPointerException: tentative d'écriture dans le champ 'int android.view.ViewGroup $ LayoutParams.height' sur une référence d'objet nul
MD Khali
8

Le moyen le plus simple et le plus simple de définir un bouton dynamiquement est

 Button index=new Button(this);
 int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45, getResources().getDisplayMetrics());             
 int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 42, getResources().getDisplayMetrics());

La hauteur et la largeur ci-dessus sont en pixels px . 45 étant la hauteur en dp et 42 étant la largeur en dp .

 index.setLayoutParams(new <Parent>.LayoutParams(width, height));

Ainsi, par exemple, si vous avez placé votre bouton dans un TableRow dans un TableLayout, vous devriez l'avoir comme TableRow.LayoutParams

 index.setLayoutParams(new TableRow.LayoutParams(width, height));
Ali Kahoot
la source
8

Créez simplement un objet LayoutParams et affectez-le à votre imageView

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(150, 150);
imageView.setLayoutParams(params);
Zubair Akber
la source
5
image_view.getLayoutParams().height 

renvoie la valeur de la hauteur en pixels. Vous devez d'abord obtenir les dimensions de l'écran pour définir correctement les valeurs.

 Display display = context.getWindowManager().getDefaultDisplay();
 DisplayMetrics outMetrics = new DisplayMetrics();
 display.getMetrics(outMetrics);
 int screen_height = outMetrics.heightPixels;
 int screen_width = outMetrics.widthPixels;

Après avoir obtenu les dimensions de l'écran, vous pouvez définir la largeur et la hauteur de la vue d'image en utilisant les marges appropriées.

 view.getLayoutParams().height = screen_height - 140;
 view.getLayoutParams().width = screen_width - 130 ;
Vikas
la source
3

Afin de définir l'ImageView et la hauteur par programme, vous pouvez faire

            //Makesure you calculate the density pixel and multiply it with the size of width/height
            float dpCalculation = getResources().getDisplayMetrics().density;
            your_imageview.getLayoutParams().width = (int) (150 * dpCalculation);

            //Set ScaleType according to your choice...
            your_imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);
BharathRao
la source
2

kotlin

val density = Resources.getSystem().displayMetrics.density
view.layoutParams.height = 20 * density.toInt()
William Hu
la source
1

Dans le scénario où la taille du widget doit être définie par programme, vérifiez les règles ci-dessous.

  1. Définissez LayoutParam la disposition dans laquelle vous ajoutez cette vue . Dans mon cas, j'ajoute TableRowdonc je devais faireTableRow.LayoutParams
  2. Suivez ce code

final float scale = getResources().getDisplayMetrics().density; int dpWidthInPx = (int) (17 * scale); int dpHeightInPx = (int) (17 * scale);

TableRow.LayoutParams deletelayoutParams = new TableRow.LayoutParams(dpWidthInPx, dpHeightInPx); button.setLayoutParams(deletelayoutParams); tableRow.addView(button, 1);

Rohit Mandiwal
la source
1
J'aime ça. Je l'utilise! Merci.
n00dles
0

Si vous souhaitez simplement ajuster l'image dans la vue d'image, vous pouvez utiliser le "contenu enveloppé" dans la propriété de hauteur et de largeur avec le type d'échelle, mais si vous souhaitez définir manuellement, vous devez utiliser LayoutParams.

Layoutparams est efficace pour définir la hauteur et la largeur de la disposition par programme.

raj kavadia
la source
0
int newHeight = 150;
            int newWidth = 150; 
            holder.iv_arrow.requestLayout();
            holder.iv_arrow.getLayoutParams().height = newHeight;
            holder.iv_arrow.getLayoutParams().width = newWidth;
            holder.iv_arrow.setScaleType(ImageView.ScaleType.FIT_XY);
            holder.iv_arrow.setImageResource(R.drawable.video_menu);
MEGHA DOBARIYA
la source