প্রোগ্রামযোগ্যভাবে অঙ্কনযোগ্য রঙ পরিবর্তন করুন


139

আমি কোড দ্বারা একটি সাদা চিহ্নিতকারী চিত্রের রঙ পরিবর্তন করার চেষ্টা করছি। আমি পড়েছি নীচের কোডটির রঙ পরিবর্তন করা উচিত তবে আমার চিহ্নিতকারীটি সাদা থাকবে।

Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )

আমি কি কিছু রেখে গেলাম? আমার রেজ ফোল্ডারে অবস্থিত আমার আঁকতে রঙ পরিবর্তন করার অন্য কোনও উপায় আছে কি?


গৃহীত উত্তরের জন্য কাজ করে নি me..used এই কিভাবে উত্তর দিতে [1] [1]: stackoverflow.com/questions/5940825/...
sham.y

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

উত্তর:


258

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

Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable); 
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED);    

ব্যবহার DrawableCompatকরা গুরুত্বপূর্ণ কারণ এটি পিছনে সামঞ্জস্যতা এবং এপিআই 22 ডিভাইসগুলিতে এবং তার আগের বগ ফিক্স সরবরাহ করে।


হুম, রঙ সাদা থাকে। হ্যালো ম্যাপভিউ OverlayItemsক্লাসের সাথে কি এমন সমস্যা রয়েছে যা সমস্যার কারণ হতে পারে? এটি আমার রেজ ফোল্ডার থেকে নিয়মিত আকর্ষণীয়, বিশেষ কিছু নয় ...
জোহান

সুতরাং সমাধান কি ছিল?
স্পিডিনোমডস

@ ρяσѕρєя কে আপনি খুব ভয়ঙ্কর very সমস্ত সহায়ক
লুটো অ্যান্ড্রয়েড

30
আপনি যদি পোর্টারডাফ.মোড.এসআরসিএনপি পছন্দ করতে পারেন আপনি যদি এটির রঙের বিস্তৃত পরিসরের সাথে কাজ করতে চান।
লার্ন লালিবার্তে

1
পোর্টারডাফ কালারফিল্টর কনস্ট্রাক্টর এআরজিবি রঙিন বিন্যাস গ্রহণ করে
রিচএক্স

124

আপনি এসভিজি ভেক্টর আঁকার জন্য এটি চেষ্টা করতে পারেন

DrawableCompat.setTint(
    DrawableCompat.wrap(myImageView.getDrawable()),
    ContextCompat.getColor(context, R.color.another_nice_color)
);

4
এসভিজি-র জন্য আমি সবচেয়ে ভালভাবে দেখেছি।
এপ্রিস্টকে

1
গ্রহণযোগ্য উত্তরের চেয়ে এটিকে অগ্রাধিকার দিন, যদিও উভয়ই কাজ করবে, তবে এই একটি দিয়ে আমাকে কী আঁকতে হবে তা নিয়ে চিন্তা করার দরকার নেই, আমি কেবল একটি ইতিমধ্যে সেখানে পেয়েছি, এবং এটি পিছনেও সামঞ্জস্যপূর্ণ, দুর্দান্ত!
আরজেফারেস

1
কোনও কিছুই কবিতার মতো কাজ করে নিলে সেরা উত্তর! অনেক ধন্যবাদ! নোট: এটি যখন আপনি আপনার imageView / AppCompatImageView একটি XML অঙ্কনযোগ্য আছে তাদের জন্য কাজ করে
Sjd

1
কীভাবে এটি অগ্রগামীভাবে মুছে ফেলবেন?
হার্ডিক জোশী

1
@HardikJoshi ডকুমেন্টেশন বলেছেন: আভা মুছে ফেলতে, পাস nullকরারDrawable#setTintList(ColorStateList)
arekolek

23

আপনাকে অঙ্কনযোগ্যকে মুউটেট () কল করতে হবে অন্যথায় সমস্ত আইকন প্রভাবিত হয়েছে।

Drawable icon = ContextCompat.getDrawable(getContext(), R.drawable.ic_my_icon).mutate();
TypedValue typedValue = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.colorIcon, typedValue, true);
icon.setColorFilter(typedValue.data, PorterDuff.Mode.SRC_ATOP);

21

ললিপপ, অ্যান্ড্রয়েড 5 এ এটি করার অন্য একটি উপায় বিটম্যাপের মতো অঙ্কনযোগ্য এর মতো একটি টিন্ট সেট করছে:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_back"
    android:tint="@color/red_tint"/>

আপনি যদি আপনার আঁকতে ব্যবহার করতে চান এমন সীমিত সংখ্যক রঙ থাকে তবে এটি আপনার পক্ষে কাজ করবে। আরও তথ্যের জন্য আমার ব্লগ পোস্ট দেখুন


2
নিস! বিটিডব্লিউ, এটি প্রাক-ললিপপটিতে খুব ভাল কাজ করবে বলে মনে হচ্ছে। ( minSdkVersion 16
সবেমাত্র এটি

এইভাবে একটি বিটম্যাপ তৈরি করার সময়, এটি ব্যবহার করার সময় লেআউটের মতো ফিট করতে প্রসারিত হয় না android:background="..."। খুব অদ্ভুত!
প্রিন্স

আমি মনে করি এটি কারণ আপনি এখানে একটি নয় প্যাচ তৈরি করছেন না।
MinceMan

দুঃখিত, এই পৃষ্ঠার অস্তিত্ব নেই = (
ফান ভ্যান লিনহ

@ জোনিক আপনার প্রদত্ত প্রশ্নের উত্তর অপ্রাসঙ্গিক। এই প্রশ্নটি চিত্রাবলীতে নয়, ড্রয়যোগ্য রঙ পরিবর্তন করার উপায় জিজ্ঞাসা করছে ।
অ্যান্টনি.এইচ


10

আমি একটি জেনেরিক ফাংশন লিখেছি যাতে আপনি প্রসঙ্গটি পাস করতে পারবেন, আইকনটি আইডি ড্রয়যোগ্য / মাইপম্যাপ চিত্র আইকন এবং নতুন আইকন যা আপনাকে সেই আইকনটির জন্য প্রয়োজন।

এই ফাংশন একটি অঙ্কনীয় ফিরে।

public static Drawable changeDrawableColor(Context context,int icon, int newColor) {
    Drawable mDrawable = ContextCompat.getDrawable(context, icon).mutate(); 
    mDrawable.setColorFilter(new PorterDuffColorFilter(newColor, PorterDuff.Mode.SRC_IN)); 
    return mDrawable;
} 

changeDrawableColor(getContext(),R.mipmap.ic_action_tune, Color.WHITE);

9

আপনার মূল রঙ সাদা হওয়ার কারণে আপনি একটি কালারম্যাট্রিক্স কালার ফিল্টার চেষ্টা করতে পারেন:

// Assuming "color" is your target color
float r = Color.red(color) / 255f;
float g = Color.green(color) / 255f;
float b = Color.blue(color) / 255f;

ColorMatrix cm = new ColorMatrix(new float[] {
        // Change red channel
        r, 0, 0, 0, 0,
        // Change green channel
        0, g, 0, 0, 0,
        // Change blue channel
        0, 0, b, 0, 0,
        // Keep alpha channel
        0, 0, 0, 1, 0,
});
ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);
myDrawable.setColorFilter(cf);

7

এটি আমার পক্ষে কাজ করেছে। 0x এবং রঙের কোডের মধ্যে "এফএফ" রাখার বিষয়টি নিশ্চিত করুন। এই 0xff2196F3 টি পছন্দ করুন

Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
                    mDrawable.setColorFilter(new
                            PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));

হাই @ বেক স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। যদি এটি আপনার পক্ষে কাজ করে তবে এটি দেখানোর জন্য ন্যূনতম সমাধান সহ একটি জেসফিডেল অন্তর্ভুক্ত করা খুব সহায়ক হবে। এটি প্রশ্ন পোস্ট করা ব্যক্তিকে সঠিকভাবে বুঝতে সাহায্য করবে।
অর্জুন চৌধুরী চৌধুরী

6

গৃহীত উত্তর হিসাবে একই তবে একটি সহজ সুবিধা পদ্ধতি:

val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN)
setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)

দ্রষ্টব্য, এখানে কোডটি কোটলিন।


3

আপনি চেষ্টা করতে পারেন Mode.LIGHTENবা Mode.DARKEN। পোর্টারডাফ মোডগুলি কী করে তা ব্যাখ্যা করার জন্য অ্যান্ড্রয়েড জাভাদোকগুলি ভয়ঙ্কর। আপনি এগুলি এখানে দেখতে পারেন: পোর্টারডাফ | অ্যান্ড্রয়েড

আমি এখানে মোজিলার সাইটে কমপোজিটিংয়ের দিকে নজর দেওয়ার পরামর্শ দিই (অ্যান্ড্রয়েডের মতো সমস্ত মোড তাদের কাছে নেই তবে তাদের প্রচুর পরিমাণ রয়েছে)


3

এটি ব্যবহার করুন: জাভা জন্য

view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)

কোটলিনের জন্য

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

আপনি পোর্টারডাফ.মড.এসআরসি_এটিওপি ব্যবহার করতে পারেন, যদি আপনার পটভূমিতে গোলাকার কোণ থাকে ইত্যাদি ইত্যাদি can



0

আমি এটিই করেছি:

public static Drawable changeDrawableColor(int drawableRes, int colorRes, Context context) {
    //Convert drawable res to bitmap
    final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableRes);
    final Bitmap resultBitmap = Bitmap.createBitmap(bitmap, 0, 0,
            bitmap.getWidth() - 1, bitmap.getHeight() - 1);
    final Paint p = new Paint();
    final Canvas canvas = new Canvas(resultBitmap);
    canvas.drawBitmap(resultBitmap, 0, 0, p);

    //Create new drawable based on bitmap
    final Drawable drawable = new BitmapDrawable(context.getResources(), resultBitmap);
    drawable.setColorFilter(new
            PorterDuffColorFilter(context.getResources().getColor(colorRes), PorterDuff.Mode.MULTIPLY));
    return drawable;
}

0

সহজভাবে ব্যবহার

    android:drawableTint="@color/primary_color"

আপনার এক্সএমএল ফাইলে। প্রাথমিক_ রঙটি কাস্টম রঙে প্রতিস্থাপন করুন


0

এই পদ্ধতি তৈরি করুন:

//CHANGE ICON COLOR
private void changeIconColor(Context context ,int drawable){
    Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, drawable);
    assert unwrappedDrawable != null;
    Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
    DrawableCompat.setTint(wrappedDrawable, getResources().getColor(R.color.colorAccent));
}

এবং এটির মতো ব্যবহার করুন:

    changeIconColor(this,R.drawable.ic_home);

0

এটি করার সহজতম উপায়:

imageView.setColorFilter(Color.rgb(r, g b));

অথবা

imageView.setColorFilter(Color.argb(a, r, g, b));

a, r, g, b: রঙ আরগব মানগুলি।


এটি কেবল তখনই কাজ করবে যদি ওপি আঁকারযোগ্যগুলির পরিবর্তে চিত্রের ভিউগুলি ব্যবহার করে।
বপনফাইবার

0

যারা কোটলিনকে একটি সাধারণ এক্সটেনশন ফাংশন ব্যবহার করেন :

fun Drawable.tint(context: Context,  @ColorRes color: Int) {
    DrawableCompat.setTint(this, context.resources.getColor(color, context.theme))
}

এবং তারপর সহজভাবে না

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