Как установить маржи ImageView с помощью кода, а не XML

StackOverflow https://stackoverflow.com/questions/3416087

  •  26-09-2019
  •  | 
  •  

Вопрос

Я хочу добавить неизвестное количество ImageView Виды на мой макет с запасом. В XML я могу использовать layout_margin так:

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

Есть ImageView.setPadding(), но нет ImageView.setMargin(). Отказ Я думаю, что это вдоль линий ImageView.setLayoutParams(LayoutParams), но не уверен, что кормить это.

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

Это было полезно?

Решение

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

Дисцидентификатор

Другие советы

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

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

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

Код Кевина создает избыточность MarginLayoutParams объект. Прощественная версия:

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

Если вы хотите изменить поле ImageView, но оставьте все остальные марки INCATT.

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

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

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

Вы можете использовать этот метод, в случае, если вы хотите указать маржи в 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);
}

Я использую просто это и отлично работает:

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 ()Единица - пиксель не DP. Если вы хотите установить маржу в DP, просто внутри вашего Значения / Размещение.xml. Файл Создайте свои размеры, такие как:

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

и доступ как:

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

Создайте макет динамически и установить свой параметр, так как SetMargin () не будет работать непосредственно на 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)

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

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

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

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)

Пример код здесь, это очень легко

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

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

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

Вот пример, чтобы добавить 8px Margin слева, сверху, справа, снизу.


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top