Comment définir la marge d'ImageView à l'aide de code, pas de XML


177

Je souhaite ajouter un nombre inconnu de ImageViewvues à ma mise en page avec marge. En XML, je peux utiliser layout_margincomme ceci:

<ImageView android:layout_margin="5dip" android:src="@drawable/image" />

Il y a ImageView.setPadding(), mais non ImageView.setMargin(). Je pense que cela va dans le sens ImageView.setLayoutParams(LayoutParams), mais je ne sais pas quoi alimenter cela.

Est-ce que quelqu'un sait?

Réponses:


381

android.view.ViewGroup.MarginLayoutParamsa une méthode setMargins(left, top, right, bottom). Sous - classes directes sont: FrameLayout.LayoutParams, LinearLayout.LayoutParamset RelativeLayout.LayoutParams.

En utilisant par exemple LinearLayout:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(left, top, right, bottom);
imageView.setLayoutParams(lp);

MargeMise en pageParams

Cela définit les marges en pixels. Pour le mettre à l'échelle, utilisez

context.getResources().getDisplayMetrics().density

DisplayMetrics


18
Notez que cela définit la taille de la marge en PIXELS, n'est pas la même que l'unité dpi dans le xml de cette question.
aromero

Comment pouvons-nous utiliser une valeur dpi au lieu d'un pixel?
Pascal Piché

10
Vous pouvez redimensionner la valeur px utilisant context.getResources () getDisplayMetrics () densité.. Developer.android.com/reference/android/util/...
Key

1
Notez qu'il peut y avoir des problèmes avec FrameLayout.LayoutParamset peut-être avec d'autres: stackoverflow.com/questions/5401952/…
Dmitry Zaytsev

au cas où nous voulions définir uniquement la marge inférieure de la vue de l'image qui est android:layout_centerHorizontal = "true"et android:layout_alignParentBottom = "true"de quelle manière je pourrais accomplir cela?
ssrp

51
    image = (ImageView) findViewById(R.id.imageID);
    MarginLayoutParams marginParams = new MarginLayoutParams(image.getLayoutParams());
    marginParams.setMargins(left_margin, top_margin, right_margin, bottom_margin);
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
    image.setLayoutParams(layoutParams);

5
Quel est le problème avec les 2 dernières lignes? cloner les paramètres de marge dans une autre variable de paramètres? Je peux confirmer que c'est nécessaire :)
Adam Rabung

1
au cas où nous voulions définir uniquement la marge inférieure de la vue de l'image qui est android:layout_centerHorizontal = "true"et android:layout_alignParentBottom = "true"de quelle manière je pourrais accomplir cela?
ssrp

layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
cwhsu

La création d'un autre paramètre de mise en page est requise. Merci :)
Muzaffer

42

Tous les exemples ci - dessus seront effectivement REMPLACER tout params déjà présent pour la vue, qui peut ne pas être désiré. Le code ci-dessous ne fera qu'étendre les paramètres existants, sans les remplacer:

ImageView myImage = (ImageView) findViewById(R.id.image_view);
MarginLayoutParams marginParams = (MarginLayoutParams) image.getLayoutParams();
marginParams.setMargins(left, top, right, bottom);

1
C'est la première solution de cette liste qui a fonctionné pour moi. Les autres ont foiré les autres paramètres que j'avais définis dans le XML, y compris les paramètres RelativeLayout pour le positionnement.
Chris Dutrow

22

Le code de Kevin crée un MarginLayoutParamsobjet redondant . Version plus simple:

ImageView image = (ImageView) findViewById(R.id.main_image);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(image.getLayoutParams());
lp.setMargins(50, 100, 0, 0);
image.setLayoutParams(lp);

1
Curieusement, j'obtiens alors "Impossible de résoudre la méthode setmargins ()", c'est pourquoi j'ai cherché cette question sur Google et j'ai atterri ici.
user2875404

11

Si vous souhaitez modifier la marge de visualisation de l'image mais laissez toutes les autres marges intactes.

  1. Obtenez MarginLayoutParameters de votre vue d'image dans ce cas: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. Maintenant, changez simplement la marge que vous souhaitez modifier mais laissez les autres telles quelles:

     marginParams.setMargins(marginParams.leftMargin, 
                             marginParams.topMargin, 
                             150, //notice only changing right margin
                             marginParams.bottomMargin); 

8

Vous pouvez utiliser cette méthode, au cas où vous souhaiteriez spécifier des marges dans dp:

private void addMarginsInDp(View view, int leftInDp, int topInDp, int rightInDp, int bottomInDp) {
    DisplayMetrics dm = view.getResources().getDisplayMetrics();
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    lp.setMargins(convertDpToPx(leftInDp, dm), convertDpToPx(topInDp, dm), convertDpToPx(rightInDp, dm), convertDpToPx(bottomInDp, dm));
    view.setLayoutParams(lp);
}

private int convertDpToPx(int dp, DisplayMetrics displayMetrics) {
    float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics);
    return Math.round(pixels);
}

8

J'utilise simplement ceci et fonctionne très bien:

ImageView imageView = (ImageView) findViewById(R.id.image_id);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
layoutParams.setMargins(left, top, right, bottom);
imageView.setLayoutParams(layoutParams);

L'unité de setMargins () est le pixel et non le dp. Si vous souhaitez définir la marge dans dp, juste à l'intérieur de votre fichier values ​​/ dimens.xml , créez vos dimensions comme:

<resources>
    <dimen name="right">16dp</dimen>
    <dimen name="left">16dp</dimen>    
</resources>

et accéder comme:

getResources().getDimension(R.dimen.right);

5

Si vous utilisez kotlin, cela peut être simplifié en créant une fonction d'extension

fun View.setMarginExtensionFunction(left: Int, top: Int, right: Int, bottom: Int) {
  val params = layoutParams as ViewGroup.MarginLayoutParams
  params.setMargins(left, top, right, bottom)
  layoutParams = params
}

Maintenant, tout ce dont vous avez besoin est une vue, et cette fonction d'extension peut être utilisée n'importe où.

val imageView = findViewById(R.id.imageView)
imageView.setMarginExtensionFunction(0, 0, 0, 0)

1
cela fonctionne pour leftet les rightmarges, mais si vous avez des marges relatives ( startet end) cela ne fonctionne pas. J'ai écrit un résumé avec une version «améliorée» de votre code: gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732d (la setMarginsRelativefonction) - pourriez-vous l'inclure dans votre réponse?
Gabriel De Oliveira Rohden

4

créer une mise en page dynamiquement et définir son paramètre comme setmargin () ne fonctionnera pas directement sur une imageView

ImageView im;
im = (ImageView) findViewById(R.id.your_image_in_XML_by_id);
 RelativeLayout.LayoutParams layout = new RelativeLayout.LayoutParams(im.getLayoutParams());
                        layout.setMargins(counter*27, 0, 0, 0);//left,right,top,bottom
                        im.setLayoutParams(layout);
                        im.setImageResource(R.drawable.yourimage)

4

Pour moi, cela a fonctionné:

int imgCarMarginRightPx = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, definedValueInDp, res.getDisplayMetrics());

MarginLayoutParams lp = (MarginLayoutParams) imgCar.getLayoutParams();
lp.setMargins(0,0,imgCarMarginRightPx,0);
imgCar.setLayoutParams(lp);

2

un exemple de code est ici, c'est très simple

LayoutParams params1 = (LayoutParams)twoLetter.getLayoutParams();//twoletter-imageview
                params1.height = 70;
                params1.setMargins(0, 210, 0, 0);//top margin -210 here
                twoLetter.setLayoutParams(params1);//setting layout params
                twoLetter.setImageResource(R.drawable.oo);

0

L'utilisation d'une méthode similaire à celle-ci peut vous éviter des maux de tête dans certaines situations. Si vous avez deux passes de bricolage programmatique avec des marges, il est plus sûr de vérifier s'il existe déjà des paramètres layoutParams. S'il y a déjà des marges, il faut les augmenter et non les remplacer:

public void addMargins(View v, int left, int top, int right, int bottom) {
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
    if (params == null)
        params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                                               ViewGroup.LayoutParams.WRAP_CONTENT);
    int oldLeft = params.leftMargin;
    int oldTop = params.topMargin;
    int oldRight = params.rightMargin;
    int oldBottom = params.bottomMargin;
    params.setMargins(oldLeft + left, oldTop + top, oldRight + right, oldBottom + bottom);
    v.setLayoutParams(params);
}

0

Voici un exemple pour ajouter une marge de 8 pixels à gauche, en haut, à droite et en bas.


ImageView imageView = new ImageView(getApplicationContext());

ViewGroup.MarginLayoutParams marginLayoutParams = new ViewGroup.MarginLayoutParams(
    ViewGroup.MarginLayoutParams.MATCH_PARENT,
    ViewGroup.MarginLayoutParams.WRAP_CONTENT
);

marginLayoutParams.setMargins(8, 8, 8, 8);

imageView.setLayoutParams(marginLayoutParams);

0

Réponse de l'année 2020:

dependencies {
    implementation "androidx.core:core-ktx:1.2.0"
}

et calquez-le simplement dans votre code

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.