অ্যানড্রয়েড আকৃতির রঙ প্রোগ্রামযুক্তভাবে সেট করুন


168

প্রশ্নটি সহজ করে তুলতে আমি সম্পাদনা করছি, আশা করি এটি একটি সঠিক উত্তরের দিকে সহায়তা করবে।

বলুন আমার নীচের ovalআকার রয়েছে:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:angle="270"
           android:color="#FFFF0000"/>
    <stroke android:width="3dp"
            android:color="#FFAA0055"/>
</shape>

আমি কীভাবে কোনও ক্রিয়াকলাপের ক্লাসের মধ্যে থেকে প্রোগ্রামটিকেগতভাবে রঙ সেট করব?


আপনি এটিকে কী আঁকতে সক্ষম করেছেন?
বিক্রম

অঙ্কনযোগ্য একটি ovalএবং একটি চিত্রভিউয়ের পটভূমি।
কোট মৌনিও

যদি জিজ্ঞাসা করা এই প্রশ্নটি খুব কঠিন হয়, তবে কোনও ক্যানভাসে একাধিক চিত্র আঁকতে এবং স্তরযুক্ত প্রান্ত পণ্যটিকে একটি দৃশ্যের পটভূমি হিসাবে সেট করার কোনও উপায় আছে কি?
কোট মৌনিও

আপনি Viewক্লাসটি প্রসারিত করে এবং baseউইজেটগুলি ( RelativeLayout, FrameLayout) এর ওভারল্যাপিংয়ের অনুমতি দেয় এমন বিন্যাসে দৃশ্য হিসাবে এটি ব্যবহার করতে পারেন । এই বর্ধিত ইনসাইড Viewবর্গ, আপনি যা করতে পারেন draw multiple images onto a canvas। তবে, এটি করার আগে, এটি দেখুন -> লিঙ্কটি (যদি আপনি ইতিমধ্যে না থাকেন)।
বিক্রম

উত্তর:


266

নোট : উত্তর দৃশ্যকল্প যেখানে আবরণ আপডেট করা হয়েছে backgroundএর একটি দৃষ্টান্ত হল ColorDrawable। এটি উল্লেখ করার জন্য ধন্যবাদ টাইলার ফাফফ

অঙ্কনযোগ্য একটি ডিম্বাকৃতি এবং একটি চিত্রভিউয়ের পটভূমি

পান Drawableথেকে imageViewব্যবহার getBackground():

Drawable background = imageView.getBackground();

সাধারণ সন্দেহভাজনদের বিরুদ্ধে পরীক্ষা করুন:

if (background instanceof ShapeDrawable) {
    // cast to 'ShapeDrawable'
    ShapeDrawable shapeDrawable = (ShapeDrawable) background;
    shapeDrawable.getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    // cast to 'GradientDrawable'
    GradientDrawable gradientDrawable = (GradientDrawable) background;
    gradientDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    // alpha value may need to be set again after this call
    ColorDrawable colorDrawable = (ColorDrawable) background;
    colorDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

কমপ্যাক্ট সংস্করণ:

Drawable background = imageView.getBackground();
if (background instanceof ShapeDrawable) {
    ((ShapeDrawable)background).getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    ((GradientDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    ((ColorDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

নোট-চেকিং প্রয়োজন হয় না তা নোট করুন।

যাইহোক, আপনার mutate()অন্য কারও ব্যবহৃত হয় যদি পরিবর্তনযোগ্যদের আগে তাদের পরিবর্তন করার আগে তাদের ব্যবহার করা উচিত । (ডিফল্টরূপে, এক্সএমএল থেকে লোডযোগ্য আঁকাগুলি একই অবস্থায় ভাগ করে।


3
উত্তর করার জন্য ধন্যবাদ. (+1 টি)। আমার কোডটি অন্যান্য বাগগুলি অনুভব করছে তাই এটি পরীক্ষা করা কঠিন। তবে এখনও solidএটি আকারের অংশটি নির্ধারণ করতে পারে । কেমন strokeঅংশ?
কোট মৌনিও

1
@ টিগার @usernameআপনার ব্যবহারে কোনও বিজ্ঞপ্তি প্রেরণ করা হয়েছে তা নিশ্চিত করার জন্য আপনার মন্তব্যে যুক্ত করা উচিত । যাইহোক, ShapeDrawableস্ট্রোকের অংশটি সেট করতে আপনাকে সাবক্লাস করতে হবে । আরও তথ্য এখানে: লিঙ্ক । মন্তব্যটি দেখুন কারণ এটি গৃহীত উত্তরের সাথে একটি সমস্যার উল্লেখ করেছে।
বিক্রম

3
android.graphics.drawable.GradientDrawable android.graphics.drawable.ShapeDrawable কাস্ট করা যাবে না ঢালাই আমাকে ব্যর্থ
জন

3
@ জন আপনার ImageView'sব্যাকগ্রাউন্ডটি একটি তে সেট করা থাকলে GradientDrawable, এটিকে getBackground()ফিরে আসবে না ShapeDrawable। পরিবর্তে, ব্যবহার GradientDrawableকরে ফিরিয়ে দেওয়া হয়: GradientDrawable gradientDrawable = (GradientDrawable)imageView.getBackground();.... gradientDrawable.setColors(new int[] { color1, color2 });
বিক্রম

2
ধন্যবাদ .. আমার পৃথিবী বাঁচিয়েছে।
sid_09

43

এটি করুন:

    ImageView imgIcon = findViewById(R.id.imgIcon);
    GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
    backgroundGradient.setColor(getResources().getColor(R.color.yellow));

1
@ user3111850 আপনি কল করার আগে আপনি কি android:backgroundআপনার এক্সএমএল যোগ করেছেন বা এমনকি setBackgroundক্রিয়াকলাপে যুক্ত করেছেন getBackground()? আপনি যদি এটি করে থাকেন তবে এটি কাজ করা উচিত।
লি ইয়ি হং

41

আজকাল একটি সহজ সমাধান হ'ল আপনার আকৃতিটিকে ব্যাকগ্রাউন্ড হিসাবে ব্যবহার করা এবং তারপরে প্রোগ্রামের মাধ্যমে এর রঙ পরিবর্তন করা:

view.background.setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP)

উপলব্ধ বিকল্পগুলির জন্য পোর্টারডাফ.মড দেখুন ।

আপডেট (এপিআই 29):

উপরের পদ্ধতিটি এপিআই 29 এর পরে অবনতিযুক্ত এবং নিম্নলিখিত দ্বারা প্রতিস্থাপিত হয়েছে:

view.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)

উপলভ্য বিকল্পগুলির জন্য ব্লেন্ডমড দেখুন ।


4
view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP);সঠিকটি হ'ল: যেহেতু পটভূমিতে বা বৃত্তাকার কর্নারগুলির একটি সীমানা থাকতে পারে।
বার্কে তুরানস

1
খুব সুন্দর একটি @ বার্কেটুরানসı আমার আকৃতির গোলাকার কোণ রয়েছে। আমি getBackground()কলটি বাদ দিতে পারি । আমার ইমেজভিউ.এসসিআরএকে একটি আকৃতি রয়েছে এবং আমি ব্যবহার করেছি: imageIndicator.setColorFilter(toggleColor, PorterDuff.Mode.SRC_ATOP);যেখানে toggleColorকেবলমাত্র এমন একটি ইতিমধ্যে পাওয়া যাবে যা ফলাফলটি কালার () থেকে ফলাফল সংরক্ষণ করেছিল
কেউ কোথাও কোথাও

1
রয়ে PorterDuff.Modeজন্য BlendModeColorFilterকম্পাইল করা হবে না যেমন প্রয়োজন BlendMode। সুতরাং API 29 এর জন্য এটি হওয়া উচিত view.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)
ওনিক

অনিককে ভাল ক্যাচ করুন আমি সেই অনুযায়ী উত্তর আপডেট করেছি। ধন্যবাদ!
জর্জিওস

14

এটা চেষ্টা কর:

 public void setGradientColors(int bottomColor, int topColor) {
 GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]  
 {bottomColor, topColor});
 gradient.setShape(GradientDrawable.RECTANGLE);
 gradient.setCornerRadius(10.f);
 this.setBackgroundDrawable(gradient);
 }

আরও বিশদের জন্য এই লিঙ্কটি এটি পরীক্ষা করে দেখুন

আশা করি সাহায্য।


লিঙ্কের জন্য ভোট দিন। তবে এটি আমার প্রশ্নের উত্তর নয়।
কোট মৌনিও

13

আশা করি এটি একই সমস্যা সহকারে কাউকে সহায়তা করবে

GradientDrawable gd = (GradientDrawable) YourImageView.getBackground();
//To shange the solid color
gd.setColor(yourColor)

//To change the stroke color
int width_px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, youStrokeWidth, getResources().getDisplayMetrics());
gd.setStroke(width_px, yourColor);

1
প্রাথমিকভাবে আমি এটি কাজ করতে পারিনি, আমি বুঝতে পেরেছিলাম আপনার রঙ অবশ্যই এইভাবে সরবরাহ করা উচিত:gd.setStroke(width_px, Color.parseColor("#FF5722"));
pwnsauce

12

বিক্রমের উত্তরটি প্রসারিত করে , আপনি যদি গতিশীল দৃষ্টিভঙ্গিগুলি রঙ করতে থাকেন, যেমন পুনর্ব্যবহারযোগ্য ভিউ আইটেম ইত্যাদি Then .... তবে রঙটি সেট করার আগে আপনি সম্ভবত মুউটেট () কল করতে চান। আপনি যদি এটি না করেন তবে যে কোনও মতামতগুলির একটি সাধারণ অঙ্কনযোগ্য (অর্থাত্ একটি পটভূমি) রয়েছে তাদের আঁকার পরিবর্তনযোগ্য / বর্ণযুক্ত হবে।

public static void setBackgroundColorAndRetainShape(final int color, final Drawable background) {

    if (background instanceof ShapeDrawable) {
        ((ShapeDrawable) background.mutate()).getPaint().setColor(color);
    } else if (background instanceof GradientDrawable) {
        ((GradientDrawable) background.mutate()).setColor(color);
    } else if (background instanceof ColorDrawable) {
        ((ColorDrawable) background.mutate()).setColor(color);
    }else{
        Log.w(TAG,"Not a valid background type");
    }

}

3
প্রয়োজনীয়তা এবং অতিরিক্ত চেক এবং প্যারামিটার: if (background instanceof LayerDrawable) { background = ((LayerDrawable) background.mutate()).getDrawable(indexIfLayerDrawable); } if (background instanceof ShapeDrawable)[...]ব্যাকগ্রাউন্ড লেআউট ব্যবহার করে তা মোকাবেলা করতে <layer-list ... <item ...
জনি

11

এই প্রশ্নের কিছুক্ষণ আগে উত্তর দেওয়া হয়েছিল, তবে কোটলিন এক্সটেনশন ফাংশন হিসাবে পুনরায় লিখে এটি আধুনিকায়ন করতে পারে।

fun Drawable.overrideColor(@ColorInt colorInt: Int) {
    when (this) {
        is GradientDrawable -> setColor(colorInt)
        is ShapeDrawable -> paint.color = colorInt
        is ColorDrawable -> color = colorInt
    }
}

7

এটি আমার জন্য কাজ করে এমন সমাধান ... এটি আরও একটি প্রশ্নে লিখেছিলেন: কীভাবে আকারের রঙ পরিবর্তনশীল?

//get the image button by id
ImageButton myImg = (ImageButton) findViewById(R.id.some_id);

//get drawable from image button
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable();

//set color as integer
//can use Color.parseColor(color) if color is a string
drawable.setColor(color)

4

আমার জন্য কিছুই কাজ করে না তবে আমি যখন রঙিন রঙ সেট করি এটি শেপ ড্রয়যোগ্যতে কাজ করে

 Drawable background = imageView.getBackground();
 background.setTint(getRandomColor())

অ্যান্ড্রয়েড 5.0 এপিআই 21 লাগবে


3

আমার কোটলিন এক্সটেনশন ফাংশন সংস্করণটি কমপ্যাট সহ উপরের উত্তরের ভিত্তিতে :

fun Drawable.overrideColor_Ext(context: Context, colorInt: Int) {
    val muted = this.mutate()
    when (muted) {
        is GradientDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        is ShapeDrawable -> muted.paint.setColor(ContextCompat.getColor(context, colorInt))
        is ColorDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        else -> Log.d("Tag", "Not a valid background type")
    }
}

1

ব্যাসার্ধের সাথে আকারটি পূরণের সহজ উপায় হ'ল:

(view.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);

1

আমি হয়ত অনেক দেরি করে ফেলেছি B তবে আপনি যদি কোটলিন ব্যবহার করছেন। এই উপায় আছে

var gd = layoutMain.background as GradientDrawable

 //gd.setCornerRadius(10)
  gd.setColor(ContextCompat.getColor(ctx , R.color.lightblue))
  gd.setStroke(1, ContextCompat.getColor(ctx , R.color.colorPrimary)) // (Strokewidth,colorId)

উপভোগ করুন ....


0

সি # জামারিন ব্যবহারকারী যে কোনও ব্যক্তির জন্য, এখানে বিক্রমের স্নিপেটের উপর ভিত্তি করে একটি পদ্ধতি রয়েছে:

private void SetDrawableColor(Drawable drawable, Android.Graphics.Color color)
{
    switch (drawable)
    {
        case ShapeDrawable sd:
            sd.Paint.Color = color;
            break;
        case GradientDrawable gd:
            gd.SetColor(color);
            break;
        case ColorDrawable cd:
            cd.Color = color;
            break;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.