এক্সএমএল নয়, কোড ব্যবহার করে ইমেজভিউয়ের মার্জিন কীভাবে সেট করবেন


177

আমি ImageViewআমার লেআউটে মার্জিনের সাথে অজানা সংখ্যক দর্শন যোগ করতে চাই। এক্সএমএলে, আমি এটি ব্যবহার করতে পারি 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 এ মার্জিন আকার নির্ধারণ করে, এই প্রশ্নের এক্সএমএলে থাকা ডিপিআই ইউনিটের মতো নয়।
অ্যারোমো

আমরা কীভাবে পিক্সেলের পরিবর্তে একটি ডিপিআই মান ব্যবহার করতে পারি?
পাস্কেল পিচি

10
আপনি কনটেক্সট.বিটআর্সোর্সস ()। GetDisplayMetics ()। ঘনত্ব বিকাশকারী.অ্যান্ড্রয়েড
কী

1
দ্রষ্টব্য, যে কারও সাথে FrameLayout.LayoutParamsএবং অন্য কারও সাথে সমস্যা হতে পারে : স্ট্যাকওভারফ্লো
দিমিত্রি জায়েটসেভ

ক্ষেত্রে আমরা দেখি যে চিত্রটি দৃশ্য যা একমাত্র নীচে মার্জিন সেট করতে চেয়েছিলেন android:layout_centerHorizontal = "true"এবং android:layout_alignParentBottom = "true"এরকম ভাবে আমি এই কাজ করা সম্ভব হতে পারে?
এসএসআরপি

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
ডিল ডাব্লু / শেষ 2 লাইনটি কী? মার্জিন প্যারামগুলিকে অন্য প্যারামের পরিবর্তনশীলে ক্লোন করতে চান? আমি এটি প্রয়োজনীয় নিশ্চিত করতে পারি :)
অ্যাডাম রাবং

1
ক্ষেত্রে আমরা দেখি যে চিত্রটি দৃশ্য যা একমাত্র নীচে মার্জিন সেট করতে চেয়েছিলেন android:layout_centerHorizontal = "true"এবং android:layout_alignParentBottom = "true"এরকম ভাবে আমি এই কাজ করা সম্ভব হতে পারে?
এসএসআরপি

layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
সিডব্লিউএসইউ

অন্য একটি লেআউট প্যারাম তৈরি করা প্রয়োজন। ধন্যবাদ :)
মোজাফফার

42

উপরের সমস্ত উদাহরণগুলি বাস্তবে ভিউটির জন্য ইতিমধ্যে উপস্থিত যে কোনও প্যারামগুলি প্রতিস্থাপন করবে , যা পছন্দসই নয়। নীচের কোডটি কেবলমাত্র বিদ্যমান প্যারামগুলি প্রতিস্থাপন না করে প্রসারিত করবে:

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

1
এটি এই তালিকার প্রথম সমাধান যা আমার পক্ষে কাজ করেছিল। এক্সএমএলে আমি অবস্থানের জন্য রিলেটিভ লেআউট প্যারাম সহ অন্যান্য যে সমস্ত প্যারামগুলি সেট করেছি তা অন্যরা স্ক্রু করেছে।
ক্রিস ডাট্রো 18:57

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
অদ্ভুতভাবে যথেষ্ট আমি পরে "পদ্ধতি সেটমার্গিনগুলি সমাধান করতে পারি না" (তাই) এই কারণেই আমি এই প্রশ্নের জন্য গুগল করে এখানে পৌঁছেছি land
ব্যবহারকারী 2875404

11

আপনি যদি ইমেজভিউ মার্জিন পরিবর্তন করতে চান তবে অন্য সমস্ত মার্জিন অক্ষত রেখে দিন।

  1. এক্ষেত্রে আপনার চিত্র দর্শনের মার্জিনালাউটপ্যারামিটারগুলি পান: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. এখন আপনি যে মার্জিনটি পরিবর্তন করতে চান তা পরিবর্তন করুন তবে অন্যকে যেমন রয়েছে তেমন ছেড়ে দিন:

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

8

আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন, আপনি যদি ডিপিতে মার্জিন নির্দিষ্ট করতে চান:

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

সেটমার্গিনস () এর ইউনিট পিক্সেল নয় ডিপি। আপনি যদি ডিপিতে মার্জিন সেট করতে চান তবে আপনার মান / 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 মার্জিন যুক্ত করার উদাহরণ এখানে is


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)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.