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?

Bruce Lee
la source

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

Clé
la source
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);
Kevin Wadera
la source
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);
Kelevandos
la source
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);
Adam Stelmaszczyk
la source
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); 
CommonSenseCode
la source
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);
}
divonas
la source
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);
Elnoor
la source
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)
enyciaa
la source
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)
Muhammad Adil
la source
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);
Wahib Ul Haq
la source
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);
Sydroid
la source
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);
}
GA1
la source
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);
Md. Zubaer Ahammed
la source
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)
}
i30mb1
la source