프로그래밍 방식으로 드로어 블 색상 변경


139

코드로 흰색 마커 이미지의 색상을 변경하려고합니다. 아래 코드가 색상을 변경해야한다는 것을 읽었지만 마커는 흰색으로 유지됩니다.

Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )

내가 뭐 놓친 거 없니? res 폴더에있는 드로어 블에서 색상을 변경하는 다른 방법이 있습니까?


허용 대답은 작동하지 않았다 me..used이 답변하는 방법 [1] [1] : stackoverflow.com/questions/5940825/...
sham.y

여기의 모든 대답은 배경색을 변경하지만 이미지의 색은 변경하지 않는다고 생각합니다. 내가 맞아? 누구든지 제발 말해 줄 수 있습니까? 여기에있는 모든 솔루션과 stackoverflow에 대해 동일한 질문을 시도했지만 경우에 따라 배경색 만 변경됩니다. 따라서 배경색 만 변경할 수 있지만 이미지 색상은 변경할 수 없습니다. 내가 맞아?
Shirish Herwade

답변:


258

이 시도:

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

DrawableCompatAPI 22 디바이스 및 이전 버전에서 이전 버전과의 호환성 및 버그 수정을 제공하므로 사용 이 중요합니다.


흠, 색깔은 흰색으로 남아 있습니다. OverlayItems문제를 일으킬 수있는 hello mapview 클래스와 관련이있을 수 있습니까? 내 res 폴더에서 일반 드로어 블, 특별한 아무것도 ...
Johan

그래서 해결책은 무엇입니까?
speedynomads

@ ρяσѕρєяK 당신은 매우 굉장합니다. 매우 도움이됩니다
luttu android

30
더 넓은 범위의 소스 색상으로 작업하려면 PorterDuff.Mode.SRC_IN을 선호 할 수 있습니다.
Lorne Laliberte

1
PorterDuffColorFilter 생성자는 ARGB 색상 형식을 사용합니다
RichX

124

svg 벡터 드로어 블에 대해 이것을 시도 할 수 있습니다

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

4
svg에서 본 가장 좋은 방법.
apSTRK

1
둘 다 작동하지만 허용되는 대답보다 이것을 선호하지만, 이것으로 설정 가능한 드로어 블에 대해 걱정할 필요가 없습니다. 나는 이미 거기에있는 것을 얻습니다.
RJFares

1
아무것도 효과가 없을 때 가장 좋은 대답은 매력처럼 작동합니다! 고마워요! 참고 : imageView / AppCompatImageView에 XML 드로어 블이있는 경우에도 작동합니다.
Sjd

1
프로그래밍 방식으로 제거하는 방법?
Hardik Joshi

1
@HardikJoshi 문서는 말한다 : 통과, 색조를 지우려면 nullDrawable#setTintList(ColorStateList)
arekolek

23

드로어 블에서 mutate ()를 호출해야합니다. 그렇지 않으면 모든 아이콘이 영향을받습니다.

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

Lollipop, android 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
좋은! Btw, 이것은 롤리팝 이전에서도 잘 작동하는 것 같습니다. ( minSdkVersion 16Android 4.1.1 기기에서만 테스트했습니다 .)
Jonik

이 방법으로 비트 맵을 만들 때를 사용할 때와 같이 레이아웃에 맞게 늘어나지 않습니다 android:background="...". 꽤 이상하다!
프린스

나는 당신이 여기에 아홉 패치를 만들지 않기 때문이라고 생각합니다.
MinceMan

죄송합니다이 페이지가 존재하지 않습니다 = (
Phan Van Linh

@Jonik 제공된 질문에 대한 답변은 관련이 없습니다. 이 질문은 ImageView가 아닌 Drawable 의 색상 을 변경하는 방법을 묻습니다 .
Antony.H

19

당신은 이것을 시도 할 수 있습니다 ImageView. 사용하여 setColorFilter().

imageViewIcon.setColorFilter(ContextCompat.getColor(context, R.color.colorWhite));

10

컨텍스트를 전달할 수있는 일반 함수를 작성했습니다. 아이콘은 id drawable / mipmap 이미지 아이콘이며 해당 아이콘에 필요한 새로운 색상입니다.

이 함수는 드로어 블을 반환합니다.

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

키 색상이 흰색이므로 ColorMatrixColorFilter를 사용해 볼 수 있습니다.

// 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와 색상 코드 사이에 "ff"를 입력하십시오. 이 0xff2196F3처럼

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

안녕하세요 @Bek은 stackoverflow에 오신 것을 환영합니다. 이것이 효과가 있다면 최소한의 솔루션으로 jsfiddle을 포함시키는 것이 도움이 될 것입니다. 질문을 올린 사람이 올바르게 이해하는 데 도움이됩니다.
Arjun Chaudhary

6

허용되는 답변과 동일하지만 더 간단한 편의 방법 :

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

여기 코드는 Kotlin입니다.


3

Mode.LIGHTEN또는 을 시도 할 수 있습니다 Mode.DARKEN. 안드로이드 Javadocs는 PorterDuff Modes가 무엇을하는지 설명하는데 끔찍합니다. 여기서 볼 수 있습니다 : PorterDuff | 기계적 인조 인간

모질라 사이트의 컴 포지 팅을 살펴 보는 것이 좋습니다 . (그들은 안드로이드가하는 모든 모드를 가지고 있지는 않지만 많은 모드를 가지고 있습니다)


3

이것을 사용하십시오 : 자바

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

코 틀린

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

배경에 둥근 모서리 등이 있으면 PorterDuff.Mode.SRC_ATOP을 사용할 수 있습니다.


1

통사론

"your image name".setColorFilter("your context".getResources().getColor("color name"));

myImage.setColorFilter(mContext.getResources().getColor(R.color.deep_blue_new));

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"

XML 파일에서. 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 : 컬러 argb 값.


OP가 드로어 블 대신 imageView를 사용하는 경우에만 작동합니다.
SowingFiber

0

Kotlin을 사용하는 사람들을 위해 간단한 확장 기능 :

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.