Как установить маржу ImageView с помощью кода, а не xml
Я хочу добавить неизвестное число ImageView вид на мой макет с полями. В XML, я могу использовать layout_margin такой:
<ImageView android:layout_margin="5dip" android:src="@drawable/image" />
здесь ImageView.setPadding(), а не ImageView.setMargin(). Я думаю, что это по линии ImageView.setLayoutParams(LayoutParams), но не уверен, что в этой.
кто-нибудь знает?
12 ответов:
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);это устанавливает поля в пикселях. Для его масштабирования используйте
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);
Если вы хотите изменить поле imageview, но оставить все остальные поля нетронутыми.
получить MarginLayoutParameters вашего представления изображения в этом случае:
myImageViewMarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();Теперь просто измените поле, которое вы хотите изменить, но оставьте другие, как они есть:
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. Если вы хотите установить маржу в ДП, просто внутри значения/дименс.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);
пример кода здесь ,его очень легко
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);
Если вы используете 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. Если уже есть какие-то поля, их следует увеличить, а не заменять:
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); }
Comments