2010-08-05 4 views
154

Я хочу добавить неизвестное число ImageView видов на мой макет с разницей. В XML, я могу использовать layout_margin так:Как установить маржу ImageView с помощью кода, а не xml

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

Существует ImageView.setPadding(), но не ImageView.setMargin(). Я думаю, что это по строкам ImageView.setLayoutParams(LayoutParams), но не уверен, что в него есть.

Кто-нибудь знает?

ответ

333

android.view.ViewGroup.MarginLayoutParams имеет способ setMargins(left, top, right, bottom). Прямыми подклассами являются: FrameLayout.LayoutParams, LinearLayout.LayoutParams и RelativeLayout.LayoutParams.

Использование, например, 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

Это устанавливает размер полей в пикселях. Для масштабирования используйте его

context.getResources().getDisplayMetrics().density 

DisplayMetrics

+0

Спасибо, что работали –

+16

Обратите внимание, что это устанавливает размер маржи в пикселах, не такой же, как блок точек на дюйм в XML этого вопроса. – aromero

+0

Как использовать значение dpi вместо пикселя? –

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

Какова сделка с последними 2 строками? клонировать параметры поля в другую переменную params? Я могу подтвердить, что это необходимо :) –

+2

миллион, миллиард, триллион спасибо за это :) –

+1

в случае, если мы хотели установить только нижний край изображения, который является 'android: layout_centerHorizontal =" true "и' android: layout_alignParentBottom = "true" 'в waht, я мог бы это сделать? – ssrp

17

код Кевина создает избыточную MarginLayoutParams объект. Simpler версия:

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

Как ни странно, я получаю «Не могу разрешить метод setmargins()», поэтому я искал эту проблему и приземлился здесь. – user2875404

1

образец кода здесь, его очень легко

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

Вы можете использовать этот метод, в случае, если вы хотите, чтобы указать поля в дп:

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

динамически создавать макет и устанавливать его параметр как setmargin() не будет wo гк непосредственно на 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

Для меня это работало:

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

Все приведенные выше примеры фактически ЗАМЕНА любого Params уже присутствующий на View, который не может быть желательным. Ниже код будет просто расширить существующие Params, не заменяя их:

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

Это первое решение в этом списке, которое сработало для меня. Другие добавили другие параметры, которые я установил в XML, включая параметры RelativeLayout для позиционирования. –

4

Я просто использовать это и прекрасно работает:

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 единица пиксель не дп. Если вы хотите установить margin в dp, просто внутри ваших значений/размеров .XML-файл создать свои размеры, как:

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

и доступ как:

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

Tnx @ Elnoor это сработало для меня. –

7

Если вы хотите изменить запас ImageView, но оставить все другие поля нетронутыми.

  1. Получить MarginLayoutParameters вашего зрения изображения в этом случае: myImageView

    MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams(); 
    
  2. Теперь просто изменить запас, который вы хотите изменить, но оставить другим, как они:

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

Использование метода, аналогичного этому, может привести к некоторым головным болям в некоторых ситуациях. Если у вас есть два прохода программной обработки с полями, безопаснее проверять, есть ли уже установленные макеты. Если есть некоторые поля уже следует увеличивать их, а не заменять их:

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

Если вы используете Котлин, это может быть упрощена путем создания функции расширения

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 
} 

Теперь все, что вам нужно, это мнение , и эту функцию расширения можно использовать где угодно.

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