이미지보기에 색조를 설정해야합니다 ... 다음과 같이 사용하고 있습니다.
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
그러나 변하지 않습니다 ...
이미지보기에 색조를 설정해야합니다 ... 다음과 같이 사용하고 있습니다.
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
그러나 변하지 않습니다 ...
답변:
다음 코드를 통해 색조를 매우 쉽게 변경할 수 있습니다.
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 이상의 최신 지원 라이브러리가 필요합니다.
android:tint
모든 안드로이드 버전에서 작동합니다. 아마 당신이 말하는거야 drawableTint
?
대부분의 답변 setColorFilter
은 원래 요청한 것이 아닌 사용 을 나타냅니다.
사용자 @Tad는 올바른 방향으로 답변 을 제공하지만 API 21 이상에서만 작동합니다.
모든 Android 버전에서 색조를 설정하려면 다음을 사용하십시오 ImageViewCompat
.
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));
그 참고 yourTint
이 경우에하는 것은 "컬러 INT"이어야합니다. 과 같은 색상 리소스가있는 경우 R.color.blue
먼저 색상 int를로드해야합니다.
ContextCompat.getColor(context, R.color.blue);
ImageView
AppCompat 테마가있는 xml 인스턴스 또는 AppCompatImageView
하위 클래스 에서만 작동합니다 .
이것은 나를 위해 일했다
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik이 옳습니다. 코드의 다른 오류는 XML 정의 색상을 참조 할 때 발생합니다. setColorFilter
ID를 사용하여 색상 자원을 찾고 자원 을 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
방법을 너무 많이 조사하지는 않았지만 ...)
Lollipop부터 새로운 Palette 클래스와 함께 작동하는 BitmapDrawables에 대한 색조 메서드 도 있습니다 .
공공 무효 setTintList (ColorStateList 색조)
과
공공 무효 setTintMode (PorterDuff.Mode tintMode)
이전 버전의 Android에서는 DrawableCompat 라이브러리를 사용할 수 있습니다.
이 시도. 지원 라이브러리가 지원하는 모든 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의 더 흥미로운 기능에 대한 내용은 여기를 참조하십시오 .
imageView.getBackground()
때문에, 드로어 블을 얻기 위해 imageView.getDrawable()
널 (null)을 반환했다.
ADev 덕분에 더 단순화 된 확장 기능
fun ImageView.setTint(@ColorRes colorRes: Int) {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}
용법:-
imageView.setTint(R.color.tintColor)
색상이 16 진 투명도 인 경우 아래 코드를 사용하십시오.
ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));
색조를 지우려면
ImageViewCompat.setImageTintList(imageView, null);
img
는 ImageView 유형입니다.
첫 번째 답변이 효과가 없었기 때문에 :
//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을 사용하여 해당 문제를 해결할 수 있습니다.
나는 누군가를 도왔기를 바랍니다 :-)
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);
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);
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)
}
나는 이것이 모든 안드로이드 프로젝트에 유용 할 수있는 기능이라고 생각합니다!
색조 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>
app:srcCompat
대신에 사용 android:src
하고 build.gradle 파일 vectorDrawables.useSupportLibrary = true
의 defaultConfig
일부에 추가 하십시오. Kitkat 에뮬레이터에서 제대로 작동하는지 테스트했습니다.
나는 파티에 늦었지만 위의 내 소망을 보지 못했습니다. 우리는을 통해 색조 색상을 설정할 수도 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)
선택기를 색조로 설정하려는 경우 :
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
색조 기능을 설정 및 설정 해제하기 위해 확장 기능을 사용하는 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))
}
정확한 답변이 아니라 더 간단한 대안 :
이에 대한 스 니펫은 다음과 같습니다.
<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>
png
? 그러면 배경이 바뀌지 않습니까? 또한 알파와 색조는 매우 다릅니다. 색조 내가 잘못하지 않으면 색상 교체와 같습니다. 범죄 의도가 없습니다. :)