Próbuję zmienić kolor na obrazie z białym znacznikiem za pomocą kodu. Wyczytałem, że poniższy kod powinien zmienić kolor, ale mój marker pozostaje biały.
Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )
Przegapiłem coś? Czy istnieje inny sposób zmiany kolorów w moich elementach do rysowania znajdujących się w folderze res?
Odpowiedzi:
Spróbuj tego:
Używanie
DrawableCompat
jest ważne, ponieważ zapewnia kompatybilność wsteczną i poprawki błędów na urządzeniach z interfejsem API 22 i wcześniejszych.źródło
OverlayItems
klasą hello mapview, która może powodować problem? To zwykły wyciąg z mojego folderu res, nic specjalnego ...Możesz spróbować tego w przypadku rysowania wektorów svg
DrawableCompat.setTint( DrawableCompat.wrap(myImageView.getDrawable()), ContextCompat.getColor(context, R.color.another_nice_color) );
źródło
null
doDrawable#setTintList(ColorStateList)
Konieczne może być wywołanie mutate () na rysowalnym lub wpłynie to na wszystkie ikony.
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);
źródło
Innym sposobem na zrobienie tego w Lollipop, Android 5. + jest ustawienie odcienia na mapie bitowej, którą można narysować, na przykład:
<?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"/>
To zadziała, jeśli masz ograniczoną liczbę kolorów, których chcesz użyć na swoich rysunkach. Sprawdź mój post na blogu, aby uzyskać więcej informacji .
źródło
minSdkVersion 16
Androidem 4.1.1.)android:background="..."
. Dość dziwne!Możesz spróbować tego
ImageView
. za pomocąsetColorFilter()
.imageViewIcon.setColorFilter(ContextCompat.getColor(context, R.color.colorWhite));
źródło
Możesz wypróbować ColorMatrixColorFilter, ponieważ Twoim kluczowym kolorem jest biały:
// 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);
źródło
Napisałem ogólną funkcję, w której można przekazać kontekst, ikona jest ikoną do rysowania / mipmap i nowy kolor, którego potrzebujesz dla tej ikony.
Ta funkcja zwraca drawable.
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);
źródło
To zadziałało dla mnie. Upewnij się, że pomiędzy 0x a kodem koloru wpisałeś „ff”. W ten sposób 0xff2196F3
Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home); mDrawable.setColorFilter(new PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));
źródło
Taka sama, jak przyjęta odpowiedź, ale prostsza i wygodniejsza metoda:
val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable) myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN) setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)
Uwaga, kod tutaj to Kotlin.
źródło
Możesz spróbować
Mode.LIGHTEN
lubMode.DARKEN
. Javadoki z Androidem są okropne w wyjaśnianiu, co robią tryby PorterDuff. Możesz je obejrzeć tutaj: PorterDuff | AndroidProponuję rozejrzeć się po Compositing na stronie Mozilli tutaj. (Nie mają wszystkich trybów, które ma Android, ale mają ich dużo)
źródło
Użyj tego: dla java
view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)
dla Kotlin
view.background.setColorFilter(Color.parseColor("#343434"),PorterDuff.Mode.SRC_OVER)
możesz użyć PorterDuff.Mode.SRC_ATOP, jeśli twoje tło ma zaokrąglone rogi itp.
źródło
Składnia
"your image name".setColorFilter("your context".getResources().getColor("color name"));
Przykład
myImage.setColorFilter(mContext.getResources().getColor(R.color.deep_blue_new));
źródło
Dla tych, którzy używają Kotlin prostej funkcji rozszerzenia:
fun Drawable.tint(context: Context, @ColorRes color: Int) { DrawableCompat.setTint(this, context.resources.getColor(color, context.theme)) }
a potem po prostu zrób
background.tint(context, R.color.colorPrimary)
źródło
Oto co zrobiłem:
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; }
źródło
Po prostu użyj
android:drawableTint="@color/primary_color"
w Twoim pliku XML. Zastąp podstawowy_kolor na niestandardowy kolor
źródło
Utwórz metodę w następujący sposób:
//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)); }
i używaj go tak:
changeIconColor(this,R.drawable.ic_home);
źródło
Najłatwiej to zrobić:
imageView.setColorFilter(Color.rgb(r, g b));
lub
imageView.setColorFilter(Color.argb(a, r, g, b));
a, r, g, b: wartości koloru argb.
źródło