How to change colors of a Drawable in Android?

前端 未结 21 1860
野性不改
野性不改 2020-11-22 13:50

I\'m working on an android application, and I have a drawable that I\'m loading up from a source image. On this image, I\'d like to convert all of the white pixels to a dif

相关标签:
21条回答
  • 2020-11-22 14:13

    Too late but in case someone need it:

       fun setDrawableColor(drawable: Drawable, color: Int) :Drawable {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                drawable.colorFilter = BlendModeColorFilter(color, BlendMode.SRC_ATOP)
                return drawable
            } else {
                drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
                return drawable
            }
        }
    
    0 讨论(0)
  • 2020-11-22 14:14

    If you have a drawable that's a solid color and you want to change it to a differnet solid color, you can use a ColorMatrixColorFilter. Transparency is preserved.

    int iColor = Color.parseColor(color);
    
    int red   = (iColor & 0xFF0000) / 0xFFFF;
    int green = (iColor & 0xFF00) / 0xFF;
    int blue  = iColor & 0xFF;
    
    float[] matrix = { 0, 0, 0, 0, red,
                       0, 0, 0, 0, green,
                       0, 0, 0, 0, blue,
                       0, 0, 0, 1, 0 };
    
    ColorFilter colorFilter = new ColorMatrixColorFilter(matrix);
    drawable.setColorFilter(colorFilter);
    
    0 讨论(0)
  • 2020-11-22 14:15

    Check out this sample code "ColorMatrixSample.java"

    /*
     * Copyright (C) 2007 The Android Open Source Project
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package com.example.android.apis.graphics;
    
    import com.example.android.apis.R;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.*;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.View;
    
    public class ColorMatrixSample extends GraphicsActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new SampleView(this));
        }
    
        private static class SampleView extends View {
            private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            private ColorMatrix mCM = new ColorMatrix();
            private Bitmap mBitmap;
            private float mSaturation;
            private float mAngle;
    
            public SampleView(Context context) {
                super(context);
    
                mBitmap = BitmapFactory.decodeResource(context.getResources(),
                                                       R.drawable.balloons);
            }
    
            private static void setTranslate(ColorMatrix cm, float dr, float dg,
                                             float db, float da) {
                cm.set(new float[] {
                       2, 0, 0, 0, dr,
                       0, 2, 0, 0, dg,
                       0, 0, 2, 0, db,
                       0, 0, 0, 1, da });
            }
    
            private static void setContrast(ColorMatrix cm, float contrast) {
                float scale = contrast + 1.f;
                   float translate = (-.5f * scale + .5f) * 255.f;
                cm.set(new float[] {
                       scale, 0, 0, 0, translate,
                       0, scale, 0, 0, translate,
                       0, 0, scale, 0, translate,
                       0, 0, 0, 1, 0 });
            }
    
            private static void setContrastTranslateOnly(ColorMatrix cm, float contrast) {
                float scale = contrast + 1.f;
                   float translate = (-.5f * scale + .5f) * 255.f;
                cm.set(new float[] {
                       1, 0, 0, 0, translate,
                       0, 1, 0, 0, translate,
                       0, 0, 1, 0, translate,
                       0, 0, 0, 1, 0 });
            }
    
            private static void setContrastScaleOnly(ColorMatrix cm, float contrast) {
                float scale = contrast + 1.f;
                   float translate = (-.5f * scale + .5f) * 255.f;
                cm.set(new float[] {
                       scale, 0, 0, 0, 0,
                       0, scale, 0, 0, 0,
                       0, 0, scale, 0, 0,
                       0, 0, 0, 1, 0 });
            }
    
            @Override protected void onDraw(Canvas canvas) {
                Paint paint = mPaint;
                float x = 20;
                float y = 20;
    
                canvas.drawColor(Color.WHITE);
    
                paint.setColorFilter(null);
                canvas.drawBitmap(mBitmap, x, y, paint);
    
                ColorMatrix cm = new ColorMatrix();
    
                mAngle += 2;
                if (mAngle > 180) {
                    mAngle = 0;
                }
    
                //convert our animated angle [-180...180] to a contrast value of [-1..1]
                float contrast = mAngle / 180.f;
    
                setContrast(cm, contrast);
                paint.setColorFilter(new ColorMatrixColorFilter(cm));
                canvas.drawBitmap(mBitmap, x + mBitmap.getWidth() + 10, y, paint);
    
                setContrastScaleOnly(cm, contrast);
                paint.setColorFilter(new ColorMatrixColorFilter(cm));
                canvas.drawBitmap(mBitmap, x, y + mBitmap.getHeight() + 10, paint);
    
                setContrastTranslateOnly(cm, contrast);
                paint.setColorFilter(new ColorMatrixColorFilter(cm));
                canvas.drawBitmap(mBitmap, x, y + 2*(mBitmap.getHeight() + 10),
                                  paint);
    
                invalidate();
            }
        }
    }
    

    The relevant API is available here:

    0 讨论(0)
  • 2020-11-22 14:17

    The new support v4 bring tint back to api 4.

    you can do it like this

    public static Drawable setTint(Drawable d, int color) {
        Drawable wrappedDrawable = DrawableCompat.wrap(d);
        DrawableCompat.setTint(wrappedDrawable, color);
        return wrappedDrawable;
    }
    
    0 讨论(0)
  • You should do this for all APIs:

    Drawable myIcon = getResources().getDrawable( R.drawable.button ); 
    ColorFilter filter = new LightingColorFilter( Color.BLACK, Color.BLACK);
    myIcon.setColorFilter(filter);
    
    0 讨论(0)
  • 2020-11-22 14:20

    This works with everything with background:

    Textview, Button...

    TextView text = (TextView) View.findViewById(R.id.MyText);
    text.setBackgroundResource(Icon);    
    text.getBackground().setColorFilter(getResources().getColor(Color), PorterDuff.Mode.SRC_ATOP);
    
    0 讨论(0)
提交回复
热议问题