안드로이드에서 이미지 뷰의 색조를 프로그래밍 방식으로 설정하는 방법은 무엇입니까?


396

이미지보기에 색조를 설정해야합니다 ... 다음과 같이 사용하고 있습니다.

imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);

그러나 변하지 않습니다 ...


15
. 당신은 대신 정수 색상 값의 정수 리소스 ID를 사용했을 수의 GetResources ()에 R.color.blue를 변환하려고 getColor에서 (R.color.blue)
milosmns

드로어 블 드로어 블 = ...; drawable.setColorFilter (ContextCompat.getColor (context, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (드로어 블); // 모든 색상을 사용할 수 있습니다
flame3

답변:


916

다음 코드를 통해 색조를 매우 쉽게 변경할 수 있습니다.

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // 화이트 틴트

색조를 원한다면

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);

벡터 드로어 블

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);

업데이트 :
@ADev는 여기 에 자신의 답변에 새로운 솔루션이 있지만 그의 솔루션에는 25.4.0 이상의 최신 지원 라이브러리가 필요합니다.



12
xml에서 android : tint = "@ color / blue"
Luis

1
플러스 android : tint는 21+입니다
androidguy

8
android:tint모든 안드로이드 버전에서 작동합니다. 아마 당신이 말하는거야 drawableTint?
finstas

11
PorterDuff.Mode.MULTIPLY 내가 PorterDuff.Mode.SRC_IN를 사용하여 내 상황에서 작동하지 않으며, 작동
모하메드 Nageh

234

대부분의 답변 setColorFilter은 원래 요청한 것이 아닌 사용 을 나타냅니다.

사용자 @Tad는 올바른 방향으로 답변 을 제공하지만 API 21 이상에서만 작동합니다.

모든 Android 버전에서 색조를 설정하려면 다음을 사용하십시오 ImageViewCompat.

ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));

그 참고 yourTint이 경우에하는 것은 "컬러 INT"이어야합니다. 과 같은 색상 리소스가있는 경우 R.color.blue먼저 색상 int를로드해야합니다.

ContextCompat.getColor(context, R.color.blue);

6
허용되는 답변이어야합니다. ImageViewAppCompat 테마가있는 xml 인스턴스 또는 AppCompatImageView하위 클래스 에서만 작동합니다 .
Louis CAD

1
@ADev는 귀하의 솔루션에 감사하지만 질문은 2013 년에 질문되었으며 2017 년 6 월에 v4 지원 lib 25.4.0 및 2016 년 12 월 25.1.0을 갖춘 ImageViewCompat 및 AppCompatImageView 릴리스는 각각 :)
Hardik

1
@ADev는 물론 솔루션이 새롭고 최신 지원 라이브러리 25.4.0 이상이 필요하다는 답변에 올바르게 언급하지 않았습니다. 지원 라이브러리의 낮은 버전에서는이 클래스를 사용할 수 없으므로 아무도 찾을 수 없기 때문에 !! !!
그건

API 16에서는 작동하지 않습니다.
Tayyab Mazhar

49

이것은 나를 위해 일했다

mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));

네, 두 번째 매개 변수없이 저를 위해 일했습니다. 또한 갈 수 있습니다mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem Muhammad

upvoted하고 두 번째 매개 변수가 없으면 매력처럼 작동합니다. Thx @ toobsco42
Ravi Vaniya 5

35

@Hardik이 옳습니다. 코드의 다른 오류는 XML 정의 색상을 참조 할 때 발생합니다. setColorFilterID를 사용하여 색상 자원을 찾고 자원setColorFilter메소드에 전달해야 할 때 ID 만 메소드에 전달했습니다 . 아래에서 원래 코드를 다시 작성하십시오.

이 라인이 활동 내에있는 경우 :

imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

그렇지 않으면 주요 활동을 참조해야합니다.

Activity main = ...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

정수, 부울, 차원 등과 같은 다른 유형의 리소스에서도 마찬가지입니다. 문자열을 제외하고 getString()첫 번째 호출없이 액티비티에서 직접 사용할 수 있습니다 getResources()(이유를 묻지 마십시오) .

그렇지 않으면 코드가 좋아 보입니다. (나는 setColorFilter방법을 너무 많이 조사하지는 않았지만 ...)


22

모든 방법을 시도한 후에 그들은 효과가 없었습니다.

다른 PortDuff.MODE를 사용하여 솔루션을 얻습니다.

imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN);

14

Lollipop부터 새로운 Palette 클래스와 함께 작동하는 BitmapDrawables에 대한 색조 메서드 도 있습니다 .

공공 무효 setTintList (ColorStateList 색조)

공공 무효 setTintMode (PorterDuff.Mode tintMode)

이전 버전의 Android에서는 DrawableCompat 라이브러리를 사용할 수 있습니다.


2
실제로 지원 라이브러리는이를 지원합니다. 내 답변보기 : stackoverflow.com/a/34479043/878126
Android 개발자

12

이 시도. 지원 라이브러리가 지원하는 모든 Android 버전에서 작동해야합니다.

public static Drawable getTintedDrawableOfColorResId(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorRes int colorResId) {
    return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), ContextCompat.getColor(context, colorResId));
}

public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorInt int color) {
    return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), color);
}

public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Drawable inputDrawable, @ColorInt int color) {
    Drawable wrapDrawable = DrawableCompat.wrap(inputDrawable);
    DrawableCompat.setTint(wrapDrawable, color);
    DrawableCompat.setTintMode(wrapDrawable, PorterDuff.Mode.SRC_IN);
    return wrapDrawable;
}

위의 방법 중 하나를 사용하여 작동시킬 수 있습니다.

문서에서 DrawableCompat의 더 흥미로운 기능에 대한 내용은 여기를 참조하십시오 .


1
나는 또한해야 할 일을했을 imageView.getBackground()때문에, 드로어 블을 얻기 위해 imageView.getDrawable()널 (null)을 반환했다.
Rock Lee

당신이 코드에서 이미지보기 XML 또는 setImageResource에서 SRC를 사용하는 것이 될 @RockLee
orelzion

이것은 imageview 배경에 색조 색상을 설정하는 완벽한 방법입니다
leegor

12

ADev 덕분에 더 단순화 된 확장 기능

fun ImageView.setTint(@ColorRes colorRes: Int) {
    ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}

용법:-

imageView.setTint(R.color.tintColor)

Button / TextView의 텍스트 색조와 비슷한 것이 있습니까?
안드로이드 개발자

textview drawable에 대한 textview 텍스트 색상 또는 색조를 의미합니까?
Manohar Reddy

"텍스트 색조"를 의미합니다. 텍스트의 색입니다. 그러나 텍스트에 각 상태의 색상이 있기 때문에 문제가 있다고 생각합니다 ... 다시 강조 표시 색상을 설정할 때 어떻게 작동합니까? 프로그래밍 방식으로 특정 버튼 (또는 TextView)?
안드로이드 개발자

11

색상이 16 진 투명도 인 경우 아래 코드를 사용하십시오.

ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));

색조를 지우려면

ImageViewCompat.setImageTintList(imageView, null);

"img"의 유형은 무엇입니까
Beyaz

1
@Beyaz img는 ImageView 유형입니다.
사이


9

첫 번째 답변이 효과가 없었기 때문에 :

//get ImageView
ImageView myImageView = (ImageView) findViewById(R.id.iv);

//colorid is the id of a color defined in values/colors.xml
myImageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.colorid)));

이것은 API 21 이상에서만 작동하는 것으로 보이지만 나에게는 문제가되지 않았습니다. ImageViewCompat을 사용하여 해당 문제를 해결할 수 있습니다.

나는 누군가를 도왔기를 바랍니다 :-)


7

Lollipop부터는 ImageView#setImageTintList()사용할 수 있는 방법 이 있습니다 ColorStateList. 단 하나의 색상이 아니라 이미지의 색조를 인식 할 수 있다는 장점이 있습니다.

롤리팝 이전 기기에서는 드로어 블을 착색 한 다음 ImageView이미지 드로어 블로 설정하여 동일한 동작을 얻을 수 있습니다 .

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);

6
Random random=new Random;
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
ColorFilter cf = new PorterDuffColorFilter(Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255)),Mode.OVERLAY);

imageView.setImageResource(R.drawable.ic_bg_box);
imageView.setColorFilter(cf);

6

안드로이드에서 이미지 뷰의 색조를 프로그래밍 방식으로 설정하려면

안드로이드에 대한 두 가지 방법이 있습니다.

1)

imgView.setColorFilter(context.getResources().getColor(R.color.blue));

2)

 DrawableCompat.setTint(imgView.getDrawable(),
                     ContextCompat.getColor(context, R.color.blue));

나는 누군가를 도왔기를 바랍니다 :-)


4

Kotlin의 광범위한 채택과 유용한 확장 기능 이후 ADev답변에 추가 (제 생각에 가장 정확합니다) :

fun ImageView.setTint(context: Context, @ColorRes colorId: Int) {
    val color = ContextCompat.getColor(context, colorId)
    val colorStateList = ColorStateList.valueOf(color)
    ImageViewCompat.setImageTintList(this, colorStateList)
}

나는 이것이 모든 안드로이드 프로젝트에 유용 할 수있는 기능이라고 생각합니다!


4

색조 attr에 색상 선택기를 사용할 수 있음을 발견했습니다.

mImageView.setEnabled(true);

activity_main.xml :

<ImageView
    android:id="@+id/image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_arrowup"
    android:tint="@color/section_arrowup_color" />

section_arrowup_color.xml :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/white" android:state_enabled="true"/>
    <item android:color="@android:color/black" android:state_enabled="false"/>
    <item android:color="@android:color/white"/>
</selector>

안녕하세요, 벡터 드로어 블에서는 작동하지 않습니다. 동일한 해결 방법이 있습니까?
마누 쿠마르

@Manukumar app:srcCompat대신에 사용 android:src하고 build.gradle 파일 vectorDrawables.useSupportLibrary = truedefaultConfig일부에 추가 하십시오. Kitkat 에뮬레이터에서 제대로 작동하는지 테스트했습니다.
안드로이드 개발자

3

사용하지 마십시오 . 모두 PoterDuff.Mode사용하십시오 setColorFilter().

ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));

2

@milosmns가 말했듯이 사용해야합니다 imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

이 API는 색상 리소스 ID 대신 색상 값이 필요합니다. 이것이 문이 작동하지 않는 근본 원인입니다.


2

나는 파티에 늦었지만 위의 내 소망을 보지 못했습니다. 우리는을 통해 색조 색상을 설정할 수도 setImageResource()있습니다 (내 minSdkVersion은 24입니다).

먼저 셀렉터를 생성하고 /drawable애셋 폴더에 저장해야 합니다 (이것을 호출합니다 ic_color_white_green_search.xml).

<!-- Focused and not pressed -->
<item android:state_focused="true"
      android:state_pressed="false">

    <bitmap android:src="@drawable/ic_search"
            android:tint="@color/branding_green"/>
</item>

<!-- Focused and pressed -->
<item android:state_focused="true"
      android:state_pressed="true">

    <bitmap android:src="@drawable/ic_search"
            android:tint="@color/branding_green"/>
</item>

<!-- Default -->
<item android:drawable="@drawable/ic_search"/>

그런 다음 코드로 설정하십시오.

val icon = itemView.findViewById(R.id.icon) as ImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)


0

색조 기능을 설정 및 설정 해제하기 위해 확장 기능을 사용하는 Kotlin 솔루션 :

fun ImageView.setTint(@ColorInt color: Int?) {
    if (color == null) {
        ImageViewCompat.setImageTintList(this, null)
        return
    }
    ImageViewCompat.setImageTintMode(this, PorterDuff.Mode.SRC_ATOP)
    ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(color))
}

-4

정확한 답변이 아니라 더 간단한 대안 :

  • 이미지 위에 다른 뷰를 배치
  • 원하는 효과를 얻으려면 프로그래밍 방식으로 뷰 의 알파 값을 변경하십시오 .

이에 대한 스 니펫은 다음과 같습니다.

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="@dimen/height120"
        android:contentDescription="@string/my_description"
        android:scaleType="fitXY"
        android:src="@drawable/my_awesome_image"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/height120"
        android:alpha="0.5"
        android:background="@color/my_blue_color"/>
</FrameLayout>

이것은 색조에 관한 것입니다! 투명성을위한 알파가 아닙니다.
David

그러나 그것은 색조로 작용합니다. 직접 시도해야합니다. 이것은 사물을 보는 한 가지 방법 일뿐입니다.
Shubham Chaudhary

@ShubhamChaudhary 나는 이것이 늦었다는 것을 알고 있지만 이미지가 있다면 무엇입니까 png? 그러면 배경이 바뀌지 않습니까? 또한 알파와 색조는 매우 다릅니다. 색조 내가 잘못하지 않으면 색상 교체와 같습니다. 범죄 의도가 없습니다. :)
KISHORE_ZE

유효한 포인트. 이 대답은 내 경우에 도움이되었습니다. 희망은 다른 사람의 신발에도 잘 맞습니다.
Shubham Chaudhary 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.