web-dev-qa-db-fra.com

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

Je souhaite ajouter un nombre inconnu de vues ImageView à ma mise en page avec marge. En XML, je peux utiliser layout_margin comme ceci:

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

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

Est-ce que quelqu'un sait?

164
Bruce Lee

Android.view.ViewGroup.MarginLayoutParams a une méthode setMargins(left, top, right, bottom). Les sous-classes directes sont: FrameLayout.LayoutParams, LinearLayout.LayoutParams et 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);

MarginLayoutParams

Cela définit les marges en pixels. Pour le redimensionner, utilisez

context.getResources().getDisplayMetrics().density

DisplayMetrics

356
Key
    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);
44
Kevin Wadera

Tous les exemples ci-dessus vont en réalité REMPLACER tous les paramètres déjà présents pour la vue, ce qui peut ne pas être souhaitable. Le code ci-dessous étendra simplement 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);
28
Kelevandos

Le code de Kevin crée un objet MarginLayoutParams redondant. Version simplifiée:

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);
19
Adam Stelmaszczyk

Si vous souhaitez modifier la marge d'image mais laisser toutes les autres marges intactes.

  1. Obtenir MarginLayoutParameters de votre image voir dans ce cas: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
    
  2. Maintenant, changez simplement la marge que vous voulez changer mais laissez les autres comme ils sont:

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

Vous pouvez utiliser cette méthode si vous souhaitez 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);
}
6
divonas

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 un pixel et non un dp. Si vous souhaitez définir une marge dans dp, créez vos dimensions dans le fichier values ​​/ dimens.xml, comme suit:

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

et accès comme:

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

créer une mise en page de manière dynamique et définir son paramètre de la manière suivante: 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)
3
Muhammad Adil

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);
3
Wahib Ul Haq

exemple de code est ici, c'est très facile

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);
2
Sydroid

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
}

Désormais, 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
enyciaa

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
Md. Zubaer Ahammed

Utiliser une méthode semblable à celle-ci pourrait vous éviter quelques maux de tête dans certaines situations ... Si vous avez deux passes de bricolage programmé avec des marges, il est plus sûr de vérifier si certains layoutParams sont déjà définis. 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
GA1