কীভাবে প্রোগ্রামিয়ালি কোণে গোল করে এবং এলোমেলো ব্যাকগ্রাউন্ডের রঙ সেট করা যায়


114

আমি কোনও দৃশ্যের কোণগুলিকে গোল করতে এবং রানটাইম অনুসারে সামগ্রীর উপর ভিত্তি করে দর্শনের রঙ পরিবর্তন করতে চাই।

TextView v = new TextView(context);
v.setText(tagsList.get(i));
if(i%2 == 0){
    v.setBackgroundColor(Color.RED);
}else{
    v.setBackgroundColor(Color.BLUE);
}

v.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
v.setPadding(twoDP, twoDP, twoDP, twoDP);               
v.setBackgroundResource(R.drawable.tags_rounded_corners);

আমি আশা করছিলাম একটি অঙ্কনযোগ্য সেট এবং রঙটি ওভারল্যাপ হয়ে যাবে, তবে তারা তা করে না। আমি দ্বিতীয় যেটুকু মৃত্যুদণ্ড কার্যকর করি তা হ'ল ফলাফলের পটভূমি।

প্রোগ্রামটিমেটিকভাবে এই দৃশ্যটি তৈরি করার কোনও উপায় আছে কি না তা মনে রেখে পটভূমির রঙ রানটাইম পর্যন্ত স্থির হবে না?

সম্পাদনা করুন: আমি পরীক্ষার জন্য এখন কেবল লাল এবং নীল রঙের মধ্যে অদলবদল করছি। পরে রঙটি ব্যবহারকারী চয়ন করতে পারবেন s

সম্পাদনা:

tags_rounded_corners.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners 
         android:bottomRightRadius="2dp" 
         android:bottomLeftRadius="2dp" 
         android:topLeftRadius="2dp" 
         android:topRightRadius="2dp"/>
</shape>

অবশ্যই ব্যাকগ্রাউন্ড রঙ এবং পটভূমি চিত্র একে অপরকে ওভাররাইড করে। আপনি কি অর্জন করার চেষ্টা করছেন? কী tags_rounded_corners?
অ্যালেক্স MDC

আপনি আরও কোড প্রদর্শন করতে পারেন? এটি দেখতে দুর্দান্ত লাগছে, তাই আমি আশ্চর্য হয়েছি আপনি কোনও ধরনের তালিকাভিউ ব্যবহার করতে পারেন বা বিদ্যমান পাঠ্যদর্শনটি পুনরায় ব্যবহার করতে পারেন।
চানসুক

উত্তর:


211

পরিবর্তে setBackgroundColor, পটভূমি আঁকতে সক্ষম পুনরুদ্ধার করুন এবং এর রঙ সেট করুন:

v.setBackgroundResource(R.drawable.tags_rounded_corners);

GradientDrawable drawable = (GradientDrawable) v.getBackground();
if (i % 2 == 0) {
  drawable.setColor(Color.RED);
} else {
  drawable.setColor(Color.BLUE);
}

এছাড়াও, আপনি আপনার মধ্যে প্যাডিং সংজ্ঞায়িত করতে পারেন tags_rounded_corners.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <corners android:radius="4dp" />
  <padding
    android:top="2dp"
    android:left="2dp"
    android:bottom="2dp"
    android:right="2dp" />
</shape> 

সঠিক উত্তর! এটি স্ট্রোকের সাথেও কাজ করেছে, তবে আমরা রংড্র্যাবল = রিসোর্স.জেটড্রেবল (আর.ড্রেবএবল.এক্স_এসডি_ সার্কেল) এর মতো কিছু ব্যবহার করে এটি তৈরি করতে পারি; colorDrawable.setColorFilter (রঙ, পোর্টারডাফ.মড.এসআরসি_এটিওপি); যদি আমাদের কোনও সীমানা না থাকে। তবে সীমানার ক্ষেত্রে আপনি কি আমাকে পোর্টারডাফ.মোডকে জানাতে পারেন যাতে স্ট্রোকের রঙটি পরিবর্তন না হয়
অখিল বাবা

এক্সএমএল এর মাধ্যমে পটভূমির রঙ কীভাবে যুক্ত করবেন?
লেনিন রাজ রাজাসেকরন

2
"V" যদি টেক্সটভিউ থেকে ভি.বেটব্যাকগ্রাউন্ড () কাস্ট করবে "java.lang.ClassCastException: android.graphics.drawable.StateListDrawable কে android.graphics.drawable.GradientDrawable এ কাস্ট করা যায় না" এই বাস্তবতা কি '13 সালে ফিরে কাজ করছে?
সোনাভলব

@ সোনাভলব আপনি ঠিক বলেছেন এটি ClassCastException দেয়
আদনান

নিখুঁত সমাধান! ধন্যবাদ!
বট

124

বৃত্তাকার কোণগুলি সেট করতে এবং একটি দৃশ্যে এলোমেলো ব্যাকগ্রাউন্ড রঙ যুক্ত করতে মোট প্রোগ্রাম্যাটিক পদ্ধতি। আমি কোডটি পরীক্ষা করেছি না, তবে আপনি ধারণাটি পাবেন।

 GradientDrawable shape =  new GradientDrawable();
 shape.setCornerRadius( 8 );

 // add some color
 // You can add your random color generator here
 // and set color
 if (i % 2 == 0) {
  shape.setColor(Color.RED);
 } else {
  shape.setColor(Color.BLUE);
 }

 // now find your view and add background to it
 View view = (LinearLayout) findViewById( R.id.my_view );
 view.setBackground(shape);

এখানে আমরা গ্রেডিয়েন্ট অঙ্কনযোগ্য ব্যবহার করছি যাতে আমরা এটি ব্যবহার করতে পারি GradientDrawable#setCornerRadiusকারণ ShapeDrawableএরূপ কোনও পদ্ধতি সরবরাহ করে না।


13
shape.setCornerRadii (কোণে); এটি খুব দরকারী
उमेश

14
PaintDrawableপরিবর্তে ব্যবহার বিবেচনা করুন GradientDrawable। এটি বৃত্তাকার কোণ এবং কেবল একটি একক রঙ সমর্থন করে যা গ্রেডিয়েন্টের চেয়ে আরও উপযুক্ত বলে মনে হয়।
সিমলম্যান

2
এটি ভাল কাজ করে! আমি এটি জামারিনে ব্যবহার করি। var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
পিয়েরে

দুর্দান্ত দ্রুত সমাধান, তবে নোট করুন যে এটির জন্য API ন্যূনতম স্তর 16
অজানা দেব

কিভাবে এক পাশের জন্য কোণার ব্যাসার্ধ সেট?
বেনামে-ই

10

আমি মনে করি এটির দ্রুততম উপায় হ'ল:

GradientDrawable gradientDrawable = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM, //set a gradient direction 
            new int[] {0xFF757775,0xFF151515}); //set the color of gradient
gradientDrawable.setCornerRadius(10f); //set corner radius

//Apply background to your view
View view = (RelativeLayout) findViewById( R.id.my_view );
if(Build.VERSION.SDK_INT>=16)
     view.setBackground(gradientDrawable);
else view.setBackgroundDrawable(gradientDrawable);    


5

আপনার যদি স্ট্রোক না হয় তবে আপনি ব্যবহার করতে পারেন

colorDrawable = resources.getDrawable(R.drawable.x_sd_circle); 

colorDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);

তবে এটি স্ট্রোকের রঙও পরিবর্তন করবে


39
আমি এটি ব্যবহার করতে যাচ্ছিলাম, তবে আমার একটি স্ট্রোক হচ্ছে।
টিম মালসিদ

2

একটি এক্সটেনশন ব্যবহার করে এখানে একটি উদাহরণ। এটি ধরে নিয়েছে যে ভিউটির একই প্রস্থ এবং উচ্চতা রয়েছে।

দেখার আকারটি পেতে একটি বিন্যাস পরিবর্তন শ্রোতা ব্যবহার করা দরকার। তারপরে আপনি এটির মতো একটি দৃশ্যে এটিকে কল করতে পারেনmyView.setRoundedBackground(Color.WHITE)

fun View.setRoundedBackground(@ColorInt color: Int) {
    addOnLayoutChangeListener(object: View.OnLayoutChangeListener {
        override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) {

            val shape = GradientDrawable()
            shape.cornerRadius = measuredHeight / 2f
            shape.setColor(color)

            background = shape

            removeOnLayoutChangeListener(this)
        }
    })
}

1

আপনি কোনও আইটেমের রঙ পরিবর্তন করতে পারেন (বিন্যাস, পাঠ্যদর্শন)। বিন্যাসে প্রোগ্রামগতভাবে রঙ সেট করতে কোডের নীচে চেষ্টা করুন

ক্রিয়াকলাপ.জভা ফাইল


String quote_bg_color = "#FFC107"
quoteContainer= (LinearLayout)view.findViewById(R.id.id_quotecontainer);
quoteContainer.setBackgroundResource(R.drawable.layout_round);
GradientDrawable drawable = (GradientDrawable) quoteContainer.getBackground();
drawable.setColor(Color.parseColor(quote_bg_color));

অঙ্কনযোগ্য ফোল্ডারে লেআউট_আউন্ড.এক্সএমএল তৈরি করুন

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorPrimaryLight"/>
    <stroke android:width="0dp" android:color="#B1BCBE" />
    <corners android:radius="10dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

ক্রিয়াকলাপ.এক্সএমএল ফাইলের বিন্যাস

<LinearLayout
        android:id="@+id/id_quotecontainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

----other components---

</LinearLayout>


1

আরও দৃশ্যমানতার জন্য @ সিমলম্যানের মন্তব্যটিকে একটি শীর্ষ-স্তরের উত্তরে অনুলিপি করা হচ্ছে :

PaintDrawable(Color.CYAN).apply {
  setCornerRadius(24f)
}

এফওয়াইআই: ShapeDrawable(এবং এর উপ- PaintDrawableটাইপ) ডিফল্ট অভ্যন্তরীণ প্রস্থ এবং উচ্চতা ০ ব্যবহার করে the

PaintDrawable(Color.CYAN).apply {
  intrinsicWidth = -1
  intrinsicHeight = -1
  setCornerRadius(24f)
}

-1একটি ম্যাজিক ধ্রুবক যা সূচিত করে যে কোনও ড্রয়াবল এর নিজস্ব ( উত্স ) কোনও অভ্যন্তরীণ প্রস্থ এবং উচ্চতা নেই ।

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