2010-08-05 13 views
154

Quiero agregar un número desconocido de ImageView vistas a mi diseño con margen. En XML, puedo usar layout_margin así:Cómo establecer el margen de ImageView usando el código, no xml

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

No es ImageView.setPadding(), pero sin ImageView.setMargin(). Creo que es a lo largo de las líneas de ImageView.setLayoutParams(LayoutParams), pero no estoy seguro de qué alimentar en eso.

¿Alguien sabe?

Respuesta

333

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 p. Ej. 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 se utiliza

context.getResources().getDisplayMetrics().density 

DisplayMetrics

+0

Gracias, que trabajó –

+16

Tenga en cuenta que esto establece el tamaño del margen en píxeles, no es la misma que la unidad ppp en el xml de esta pregunta. – aromero

+0

¿Cómo podemos usar un valor de ppp en lugar de píxel? –

41
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

¿Cuál es el trato con las últimas 2 líneas? clonar los params de margen en otra variable params? Puedo confirmar que es obligatorio :) –

+2

un millón, billón, trillón gracias por esto :) –

+1

en caso de que quisiéramos establecer solo el margen inferior de la vista de la imagen que es 'android: layout_centerHorizontal =" true "' and 'android: layout_alignParentBottom = "verdadero" '¿de qué manera podría lograr esto? – ssrp

17

código de Kevin crea redundante MarginLayoutParams objeto. 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); 
+0

Curiosamente, me aparece "No se puede resolver el método setmargins()", por lo que busqué en Google esta pregunta y llegué aquí. – user2875404

1

código de ejemplo 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); 
5

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

crear el diseño dinámicamente y establecer su parámetro como setmargin() no wo rk 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) 
3

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

Todos los ejemplos anteriores realidad reemplazará cualquier ya params presentes en la vista, que puede no ser deseado. El código siguiente se acaba de extender los parametros existentes, sin sustituirlos:

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

Esta es la primera solución en esta lista que funcionó para mí. Los otros arruinaron los otros parámetros que había establecido en el XML, incluidos los parámetros RelativeLayout para el posicionamiento. –

4

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

SetMargins() 's unidad no pixel dp. Si desea establecer el margen en dp, solo dentro de sus valores values ​​/ dimens.xml archivo crear sus dimensiones como:

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

y acceso como:

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

Tnx @Elnoor funcionó para mí. –

7

Si desea cambiar el margen imageview pero deje todos los demás márgenes intactos.

  1. Obtener MarginLayoutParameters de su vista de la imagen, en este caso: myImageView

    MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams(); 
    
  2. Ahora acaba de cambiar el margen que desee cambiar, pero dejar a los demás como son:

    marginParams.setMargins(marginParams.leftMargin, 
             marginParams.topMargin, 
             150, //notice only changing right margin 
             marginParams.bottomMargin); 
    
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 algún conjunto de parámetros de diseño. Si hay algunos márgenes ya se debería aumentar ellos 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); 
} 
1

Si utiliza Kotlin, esto puede ser simplificado mediante la creación de 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) 
Cuestiones relacionadas