कोड का उपयोग करके ImageView का मार्जिन कैसे सेट करें, xml नहीं


177

मैं ImageViewमार्जिन के साथ अपने लेआउट में अज्ञात संख्याओं को जोड़ना चाहता हूं। XML में, मैं layout_marginइस तरह का उपयोग कर सकते हैं :

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

वहाँ है ImageView.setPadding(), लेकिन नहीं ImageView.setMargin()। मुझे लगता है कि यह उसी की तर्ज पर है ImageView.setLayoutParams(LayoutParams), लेकिन यह सुनिश्चित नहीं है कि इसमें क्या खिलाना है।

क्या कोई जानता है?

जवाबों:


381

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


18
ध्यान दें कि यह PIXELS में मार्जिन आकार सेट करता है, इस प्रश्न के xml में डीपीआई इकाई के समान नहीं है।
एरोमेरो

हम पिक्सेल के बजाय dpi मान का उपयोग कैसे कर सकते हैं?
पास्कल पिछे

10
आप संदर्भ.getResources () .DDplayplayMetrics ()। घनत्व डेवलपर
कुंजी

1
ध्यान दें, कि FrameLayout.LayoutParamsअन्य के साथ और शायद समस्याएँ हो सकती हैं : stackoverflow.com/questions/5401952/…
दिमित्री ज़ैतसेव

यदि हम छवि दृश्य के केवल निचले हिस्से को सेट करना चाहते हैं जो कि है android:layout_centerHorizontal = "true"और android:layout_alignParentBottom = "true"वाह्ट तरीके से मैं इसे पूरा कर सकता हूं?
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
सौदा w / अंतिम 2 पंक्तियाँ क्या हैं? मार्जिन को किसी अन्य पैरामस चर में क्लोन करें? मैं इसकी पुष्टि कर सकता हूं :)
एडम रबंग

1
यदि हम छवि दृश्य के केवल निचले हिस्से को सेट करना चाहते हैं जो कि है android:layout_centerHorizontal = "true"और android:layout_alignParentBottom = "true"वाह्ट तरीके से मैं इसे पूरा कर सकता हूं?
ssrp

layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
14:06

एक और लेआउट परमेस बनाना आवश्यक है। धन्यवाद :)
मुज़फ़्फ़र 11

42

उपरोक्त सभी उदाहरण वास्तव में दृश्य के लिए पहले से मौजूद किसी भी परम को पुनः प्रकाशित करेंगे , जो कि वांछित नहीं हो सकता है। नीचे दिए गए कोड मौजूदा पार्म्स का विस्तार करेंगे, उन्हें प्रतिस्थापित किए बिना:

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

1
इस सूची में यह पहला समाधान है जिसने मेरे लिए काम किया। दूसरों ने एक्सएमएल में सेट किए गए अन्य पैरामेट्स को खराब कर दिया, जिसमें पोजिशनिंग के लिए RelativeLayout परम शामिल हैं।
क्रिस ड्यूट्रो

22

केविन का कोड निरर्थक 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);

1
अजीब तरह से पर्याप्त है तो मुझे "विधि समाधान सेटमर्गिन्स ()" नहीं मिल सकता है, यही कारण है कि मैं इस सवाल के लिए googled और यहां उतरा।
user2875404

11

यदि आप इमेजव्यू मार्जिन बदलना चाहते हैं, लेकिन अन्य सभी मार्जिन को बरकरार रखें।

  1. इस मामले में अपनी छवि को देखने के मार्जिन प्राप्त करें: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. अब केवल उस मार्जिन को बदलें जिसे आप बदलना चाहते हैं लेकिन दूसरों को छोड़ दें जैसे वे हैं:

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

8

यदि आप 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

मैं बस इस का उपयोग करें और महान काम करता है:

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

सेटमार्जिन () की इकाई पिक्सेल डीपी नहीं है। यदि आप dp में मार्जिन सेट करना चाहते हैं, तो बस अपने मूल्यों / dimens.xml फ़ाइल के अंदर अपने आयाम बनाएं:

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

और जैसे पहुँच:

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

5

यदि आप कोटलिन का उपयोग करते हैं, तो विस्तार फ़ंक्शन बनाकर इसे सरल बनाया जा सकता है

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)

1
यह leftऔर rightमार्जिन के लिए काम करता है , लेकिन अगर आपके पास सापेक्ष मार्जिन ( startऔर end) है तो यह काम नहीं करता है। मैंने आपके कोड के 'बेहतर' संस्करण के साथ एक जिस्ट लिखा : gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732d ( setMarginsRelativeफ़ंक्शन) - क्या आप अपने उत्तर में इसे शामिल कर सकते हैं?
गेब्रियल डी ओलिवेरा रोहडेन

4

गतिशील रूप से लेआउट बनाएं और इसके पैरामीटर को सेटमर्जिन के रूप में सेट करें () एक छवि दृश्य पर सीधे काम नहीं करेगा

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

मेरे लिए यह काम किया:

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

नमूना कोड यहाँ है, इसका बहुत आसान है

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

इसी तरह की एक विधि का उपयोग करना आपको कुछ स्थितियों में सिरदर्द से बचा सकता है। यदि आपके पास प्रोग्राम के दो पास हैं, तो मार्जिन के साथ छेड़छाड़ करना यह जांचना सुरक्षित है कि क्या पहले से ही कुछ लेआउटप्रैम सेट हैं। यदि पहले से ही कुछ मार्जिन हैं, तो उन्हें बढ़ाना चाहिए और उन्हें प्रतिस्थापित नहीं करना चाहिए:

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

यहां बाईं ओर, ऊपर, दाएं, नीचे 8px मार्जिन जोड़ने के लिए एक उदाहरण है।


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

2020 वर्ष से उत्तर:

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

और इसे बस अपने कोड में कैल

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.