Como definir a margem do ImageView usando código, não xml

177

Quero adicionar um número desconhecido de ImageViewvisualizações ao meu layout com margem. Em XML, eu posso usar layout_marginassim:

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

Existe ImageView.setPadding(), mas não ImageView.setMargin(). Eu acho que é ao longo das linhas de ImageView.setLayoutParams(LayoutParams), mas não tenho certeza do que alimentar isso.

Alguém sabe?

Bruce Lee
fonte

Respostas:

381

android.view.ViewGroup.MarginLayoutParamstem um método setMargins(left, top, right, bottom). Subclasses diretas são: FrameLayout.LayoutParams, LinearLayout.LayoutParamse RelativeLayout.LayoutParams.

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

Isso define as margens em pixels. Para escalá-lo, use

context.getResources().getDisplayMetrics().density

DisplayMetrics

Chave
fonte
18
Observe que isso define o tamanho da margem em PIXELS, não é o mesmo que a unidade de dpi no xml desta pergunta.
Aromero 13/01/12
Como podemos usar um valor de dpi em vez de pixel?
Pascal Piché
10
Você pode dimensionar o valor de px usando context.getResources (). GetDisplayMetrics (). Density developer.android.com/reference/android/util/…
Chave
1
Observe que pode haver problemas com FrameLayout.LayoutParamse talvez com outros: stackoverflow.com/questions/5401952/…
Dmitry Zaytsev
caso desejássemos definir apenas a margem inferior da visualização da imagem, que é android:layout_centerHorizontal = "true"e de que android:layout_alignParentBottom = "true"maneira eu poderia fazer isso?
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);
Kevin Wadera
fonte
5
Qual é o acordo com as duas últimas linhas? clonar os parâmetros de margem em outra variável de parâmetros? Eu posso confirmar é exigido :)
Adam Rabung
1
caso desejássemos definir apenas a margem inferior da visualização da imagem, que é android:layout_centerHorizontal = "true"e de que android:layout_alignParentBottom = "true"maneira eu poderia fazer isso?
SSRP
layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
Cwsu
É necessário criar outros parâmetros de layout. Obrigado :)
Muzaffer
42

Todos os exemplos acima substituirão, na verdade, quaisquer parâmetros já presentes na Visualização, o que pode não ser o desejado. O código abaixo apenas estenderá os parâmetros existentes, sem substituí-los:

ImageView myImage = (ImageView) findViewById(R.id.image_view);
MarginLayoutParams marginParams = (MarginLayoutParams) image.getLayoutParams();
marginParams.setMargins(left, top, right, bottom);
Kelevandos
fonte
1
Esta é a primeira solução nesta lista que funcionou para mim. Os outros estragaram os outros parâmetros que eu havia definido no XML, incluindo os parâmetros RelativeLayout para posicionamento.
Chris Dutrow
22

O código de Kevin cria um MarginLayoutParamsobjeto redundante . Versão mais simples:

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);
Adam Stelmaszczyk
fonte
1
Estranhamente, recebo "Não é possível resolver o método setmargins ()", e foi por isso que pesquisei essa questão no Google e cheguei aqui.
User2875404
11

Se você deseja alterar a margem da visualização de imagens, mas mantenha todas as outras margens intactas.

  1. Obtenha MarginLayoutParameters da sua visualização de imagem neste caso: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. Agora basta alterar a margem que deseja alterar, mas deixe as outras como estão:

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

Você pode usar este método, caso deseje especificar margens no 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);
}
divonas
fonte
8

Eu uso simplesmente isso e funciona muito bem:

ImageView imageView = (ImageView) findViewById(R.id.image_id);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
layoutParams.setMargins(left, top, right, bottom);
imageView.setLayoutParams(layoutParams);

A unidade de setMargins () é pixel, não dp. Se você deseja definir margem no dp, apenas dentro do arquivo values ​​/ dimens.xml, crie suas dimensões como:

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

e acesso como:

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

Se você usa o kotlin, isso pode ser simplificado criando uma função de extensão

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
}

Agora tudo o que você precisa é de uma visualização, e essa função de extensão pode ser usada em qualquer lugar.

val imageView = findViewById(R.id.imageView)
imageView.setMarginExtensionFunction(0, 0, 0, 0)
enyciaa
fonte
1
isso funciona para lefte rightmargens, mas se você tiver margens relativas ( starte end), não funcionará. Eu escrevi uma essência com uma versão 'aprimorada' do seu código: gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732d (a setMarginsRelativefunção) - você poderia incluir isso na sua resposta?
Gabriel De Oliveira Rohden
4

crie layout dinamicamente e defina seu parâmetro, pois setmargin () não funcionará diretamente em um 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)
Muhammad Adil
fonte
4

Para mim, isso funcionou:

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

exemplo de código está aqui, é muito 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);
Sydroid
fonte
0

Usar um método semelhante a esse pode poupar algumas dores de cabeça em algumas situações. Se você tiver duas passagens de ajustes programáticos com margens, é mais seguro verificar se já existem alguns layoutParams configurados. Se já existem margens, deve-se aumentá-las e não substituí-las:

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);
}
GA1
fonte
0

Aqui está um exemplo para adicionar margem de 8px à esquerda, superior, direita e inferior.


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);
Md. Zubaer Ahammed
fonte
0

Resposta a partir do ano 2020:

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

e chame-o simplesmente no seu código

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
i30mb1
fonte