Cómo establecer el margen de ImageView usando código, no xml

Quiero agregar un número desconocido de vistas de ImageView a mi diseño con margen. En XML, puedo usar layout_margin así:

Hay ImageView.setPadding() , pero no ImageView.setMargin() . Creo que es ImageView.setLayoutParams(LayoutParams) , pero no estoy seguro de qué ImageView.setLayoutParams(LayoutParams) en eso.

¿Alguien sabe?

android.view.ViewGroup.MarginLayoutParams tiene un método setMargins(left, top, right, bottom) . Las subclases directas son: FrameLayout.LayoutParams , LinearLayout.LayoutParams y RelativeLayout.LayoutParams .

Usando, por ejemplo, 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

Esto establece los márgenes en píxeles. Para escalar, usa

 context.getResources().getDisplayMetrics().density 

DisplayMetrics

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

Todos los ejemplos anteriores REEMPLAZARÁN cualquier parámetro ya presente para la Vista, que puede no ser deseado. El código siguiente simplemente extenderá los params existentes, sin reemplazarlos:

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

El código de Kevin crea MarginLayoutParams objeto MarginLayoutParams redundante. Versión más 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); 

Si desea cambiar el margen de la vista de imagen, deje intactos todos los otros márgenes.

  1. Obtenga MarginLayoutParameters de su vista de imagen en este caso: myImageView

      MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams(); 
  2. Ahora solo cambie el margen que desea cambiar, pero deje los otros tal como están:

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

Puede usar este método, en caso de que desee especificar márgenes en 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); } 

Yo uso simplemente esto y funciona muy 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); 

La unidad setMargins () es pixel no dp. Si desea establecer el margen en dp, solo dentro de su archivo values ​​/ dimens.xml cree sus dimensiones como:

  16dp 16dp  

y acceso como:

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

crea el diseño dinámicamente y establece su parámetro ya que setmargin () no funcionará directamente en un 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) 

Para mí esto funcionó:

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

el código de muestra está aquí, es muy fácil

 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 usa kotlin, esto se puede simplificar creando una función de extensión

 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 } 

Ahora todo lo que necesita es una vista, y esta función de extensión se puede usar en cualquier lugar.

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

Usar un método similar a esto podría ahorrarle algunos dolores de cabeza en algunas situaciones. Si tiene dos pasadas de retoques programáticos con márgenes, es más seguro verificar si ya hay algunos parámetros de diseño establecidos. Si ya hay algunos márgenes, uno debe boostlos y no reemplazarlos:

 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); }