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?
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);
Cela définit les marges en pixels. Pour le redimensionner, utilisez
context.getResources().getDisplayMetrics().density
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);
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);
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);
Si vous souhaitez modifier la marge d'image mais laisser toutes les autres marges intactes.
Obtenir MarginLayoutParameters de votre image voir dans ce cas: myImageView
MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
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);
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);
}
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);
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)
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);
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);
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)
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);
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);
}