Come impostare il margine di ImageView usando il codice, non xml


177

Voglio aggiungere un numero sconosciuto di ImageViewvisualizzazioni al mio layout con margine. In XML, posso usare layout_margincosì:

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

C'è ImageView.setPadding(), ma no ImageView.setMargin(). Penso che sia sulla falsariga di ImageView.setLayoutParams(LayoutParams), ma non sono sicuro di cosa alimentare.

Qualcuno sa?

Risposte:


381

android.view.ViewGroup.MarginLayoutParamsha un metodo setMargins(left, top, right, bottom). Sottoclassi diretti sono: FrameLayout.LayoutParams, LinearLayout.LayoutParamse RelativeLayout.LayoutParams.

Usando ad esempio 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

Questo imposta i margini in pixel. Per ridimensionarlo utilizzare

context.getResources().getDisplayMetrics().density

DisplayMetrics


18
Si noti che questo imposta la dimensione del margine in PIXELS, non è uguale all'unità dpi nell'xml di questa domanda.
Aromero

Come possiamo usare un valore dpi anziché pixel?
Pascal Piché

10
È possibile ridimensionare il valore px utilizzando context.getResources (). GetDisplayMetrics (). Density developer.android.com/reference/android/util/…
Key

1
Si noti che potrebbero esserci problemi con FrameLayout.LayoutParamse forse con altri: stackoverflow.com/questions/5401952/…
Dmitry Zaytsev

nel caso volessimo impostare solo il margine inferiore della vista dell'immagine che è android:layout_centerHorizontal = "true"e android:layout_alignParentBottom = "true"in che modo potrei farlo?
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);

5
Qual è il problema con le ultime 2 righe? clonare i parametri di margine in un'altra variabile di parametri? Posso confermare che è necessario :)
Adam Rabung,

1
nel caso volessimo impostare solo il margine inferiore della vista dell'immagine che è android:layout_centerHorizontal = "true"e android:layout_alignParentBottom = "true"in che modo potrei farlo?
ssrp,

layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
cwhsu,

È richiesta la creazione di altri parametri di layout. Grazie :)
Muzaffer

42

Tutti gli esempi precedenti sostituiranno effettivamente tutti i parametri già presenti per la vista, che potrebbero non essere desiderati. Il codice seguente estenderà solo i parametri esistenti, senza sostituirli:

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

1
Questa è la prima soluzione in questo elenco che ha funzionato per me. Gli altri hanno rovinato gli altri parametri che avevo impostato nell'XML, inclusi i parametri RelativeLayout per il posizionamento.
Chris Dutrow

22

Il codice di Kevin crea MarginLayoutParamsoggetto ridondante . Versione più semplice:

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

1
Stranamente ottengo "Impossibile risolvere il metodo setmargins ()", motivo per cui ho cercato su Google per questa domanda e sono arrivato qui.
user2875404

11

Se si desidera modificare il margine di visualizzazione delle immagini ma lasciare intatti tutti gli altri margini.

  1. Ottieni i MarginLayoutParameters della vista dell'immagine in questo caso: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. Ora cambia il margine che vuoi cambiare ma lascia gli altri così come sono:

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

8

È possibile utilizzare questo metodo, nel caso in cui si desideri specificare i margini in 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);
}

8

Uso semplicemente questo e funziona benissimo:

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à di setMargins () è pixel non dp. Se vuoi impostare il margine in dp, proprio all'interno del tuo valore / file dimens.xml crea le tue dimensioni come:

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

e accedi come:

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

5

Se usi kotlin, questo può essere semplificato creando una funzione di estensione

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
}

Ora tutto ciò che serve è una vista e questa funzione di estensione può essere utilizzata ovunque.

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

1
questo funziona per lefte rightmargini, ma se hai margini relativi ( starte end) non funziona. Ho scritto una sintesi con una versione "migliorata" del codice: gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732d (la setMarginsRelativefunzione) - potresti includerlo nella tua risposta?
Gabriel De Oliveira Rohden,

4

crea il layout in modo dinamico e imposta il suo parametro come setmargin () non funzionerà direttamente su 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)

4

Per me questo ha funzionato:

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

2

il codice di esempio è qui, è molto semplice

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

0

L'uso di un metodo simile a questo potrebbe farti venire il mal di testa in alcune situazioni. Se hai due passaggi di armeggiamento programmatico con margini è più sicuro controllare se ci sono già alcuni layoutParams impostati. Se ci sono già dei margini, è necessario aumentarli e non sostituirli:

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

Ecco un esempio per aggiungere un margine di 8px a sinistra, in alto, a destra, in basso.


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

Risposta dal 2020 anno:

dependencies {
    implementation "androidx.core:core-ktx:1.2.0"
}

e cal semplicemente nel tuo codice

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.