จำเป็นต้องตั้งค่าโทนสีสำหรับมุมมองภาพ ... ฉันใช้วิธีต่อไปนี้:
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));
// White Tint
ถ้าคุณต้องการสีอ่อนแล้ว
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);
สำหรับ Vector Drawable
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);
อัปเดต :
@ADev มีคำตอบที่ใหม่กว่าในคำตอบของเขาที่นี่แต่โซลูชันของเขาต้องการไลบรารีการสนับสนุนที่ใหม่กว่า - 25.4.0 หรือสูงกว่า
android:tint
ทำงานบน Android ทุกรุ่น บางทีคุณกำลังพูดถึงdrawableTint
?
คำตอบส่วนใหญ่อ้างถึงการใช้งานsetColorFilter
ซึ่งไม่ใช่สิ่งที่ถูกถามตั้งแต่แรก
ผู้ใช้ @Tad มีคำตอบในทิศทางที่ถูกต้อง แต่ใช้งานได้กับ API 21+ เท่านั้น
ในการตั้งค่าโทนสีบน Android ทุกรุ่นให้ใช้ImageViewCompat
:
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));
โปรดทราบว่าyourTint
ในกรณีนี้จะต้องเป็น "color int" หากคุณมีทรัพยากรสีเช่นR.color.blue
คุณต้องโหลดสี int ก่อน:
ContextCompat.getColor(context, R.color.blue);
ImageView
อินสแตนซ์xml ด้วยธีม AppCompat หรือในAppCompatImageView
คลาสย่อย
สิ่งนี้ใช้ได้สำหรับฉัน
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik มันถูกต้อง ข้อผิดพลาดอื่น ๆ ในรหัสของคุณคือเมื่อคุณอ้างอิงสีที่กำหนด XML ของคุณ คุณส่ง ID ไปยังsetColorFilter
เมธอดเท่านั้นเมื่อคุณควรใช้ ID เพื่อค้นหาทรัพยากรสีและส่งผ่านทรัพยากรไปยังsetColorFilter
เมธอด เขียนรหัสเดิมของคุณใหม่ด้านล่าง
หากบรรทัดนี้อยู่ในกิจกรรมของคุณ:
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);
โปรดทราบว่านี่เป็นความจริงของทรัพยากรประเภทอื่นเช่นจำนวนเต็ม bools ขนาด ฯลฯ ยกเว้นสตริงซึ่งคุณสามารถใช้getString()
ในกิจกรรมของคุณโดยตรงโดยไม่ต้องโทรหาก่อนgetResources()
(อย่าถามฉันว่าทำไม) .
มิฉะนั้นรหัสของคุณดูดี (แม้ว่าฉันจะไม่ได้ตรวจสอบsetColorFilter
วิธีการมากเกินไป ... )
หลังจากที่ฉันลองใช้วิธีการทั้งหมดและพวกเขาไม่ได้ผลสำหรับฉัน
ฉันได้วิธีแก้ปัญหาโดยใช้ PortDuff.MODE อื่น
imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN);
เริ่มต้นด้วย Lollipop นอกจากนี้ยังมีวิธีโทนสีสำหรับ BitmapDrawables ที่ทำงานกับคลาส Palette ใหม่:
โมฆะสาธารณะ 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()
มันกลับมาเป็นโมฆะ
ฟังก์ชั่นการขยายที่ง่ายขึ้นดีขึ้นด้วยADev
fun ImageView.setTint(@ColorRes colorRes: Int) {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}
การใช้งาน: -
imageView.setTint(R.color.tintColor)
หากสีของคุณมีความโปร่งใสฐานสิบหกให้ใช้รหัสด้านล่าง
ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));
เพื่อล้างสี
ImageViewCompat.setImageTintList(imageView, null);
img
เป็นประเภท ImageView
ง่ายและหนึ่งบรรทัด
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
ในฐานะที่เป็นคำตอบแรกไม่ได้สำหรับฉัน:
//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
เมื่อเทียบกับสีเดียวจึงทำให้ภาพของรัฐทราบสี
บนอุปกรณ์ pre-Lollipop คุณสามารถรับพฤติกรรมเดียวกันได้โดยการแต้มสี drawable แล้วตั้งเป็นImageView
ภาพของ drawable:
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);
สำหรับตั้งค่าโทนสีสำหรับมุมมองภาพโดยทางโปรแกรมใน Android
ฉันมีสองวิธีสำหรับ Android:
1)
imgView.setColorFilter(context.getResources().getColor(R.color.blue));
2)
DrawableCompat.setTint(imgView.getDrawable(),
ContextCompat.getColor(context, R.color.blue));
ฉันหวังว่าฉันช่วยทุกคนออก :-)
การเพิ่มคำตอบของADev (ซึ่งในความคิดของฉันถูกต้องที่สุด) เนื่องจากการยอมรับอย่างกว้างขวางของ Kotlin และฟังก์ชันการขยายที่เป็นประโยชน์:
fun ImageView.setTint(context: Context, @ColorRes colorId: Int) {
val color = ContextCompat.getColor(context, colorId)
val colorStateList = ColorStateList.valueOf(color)
ImageViewCompat.setImageTintList(this, colorStateList)
}
ฉันคิดว่านี่เป็นฟังก์ชั่นที่น่าจะมีประโยชน์สำหรับโครงการ Android ใด ๆ !
ฉันพบว่าเราสามารถใช้ color selector สำหรับ tint 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
และเพิ่มvectorDrawables.useSupportLibrary = true
เข้าไปในdefaultConfig
ส่วนของไฟล์ build.gradle ของคุณ ผ่านการทดสอบแล้วว่าทำงานได้ดีกับตัวจำลอง Kitkat
อย่าใช้PoterDuff.Mode
ใช้setColorFilter()
มันใช้ได้กับทุกคน
ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));
ตามที่ @milosmns กล่าวว่าคุณควรใช้
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
API นี้ต้องการค่าสีแทนรหัสทรัพยากรสีนั่นคือสาเหตุที่ทำให้คำสั่งของคุณใช้งานไม่ได้
ฉันไปงานปาร์ตี้สาย แต่ฉันไม่เห็นคำสันโดษข้างต้น เราสามารถตั้งค่าสีอ่อน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
ล่ะ ถ้าเช่นนั้นพื้นหลังจะไม่เปลี่ยนแปลงใช่ไหม นอกจากนี้อัลฟ่าและสีอ่อนแตกต่างกันมาก สีอ่อนเหมือนการเปลี่ยนสีถ้าฉันไม่ผิด ไม่มีเจตนากระทำความผิด แค่พยายามช่วย :)