Być może użyłeś identyfikatora zasobu liczby całkowitej zamiast wartości koloru całkowitego, spróbuj przekonwertować R.color.blue na getResources (). GetColor (R.color.blue)
milosmns
Wyciągany ciągnienia = ...; drawable.setColorFilter (ContextCompat.getColor (kontekst, R.color.biały), PorterDuff.Mode.DST); imageView.setImageDrawable (rysowany); // można tutaj użyć dowolnego koloru
flame3
Odpowiedzi:
916
Możesz zmienić odcień, dość łatwo w kodzie poprzez:
Powinna być zaakceptowana odpowiedź. Zauważ, że działa tylko na ImageViewinstancjach xml z kompozycją AppCompat lub na AppCompatImageViewpodklasach.
Louis
1
@ ADev doceniamy twoje rozwiązanie, ale pytanie zostało zadane w 2013 r. Oraz ImageViewCompat i AppCompatImageView wersja z obsługą v4 lib 25.4.0 odpowiednio w czerwcu 2017 r. I 25.1.0 grudnia 2016 r.
Hardik
1
@ ADev oczywiście, ale nie wspomniałeś o tym poprawnie w odpowiedzi, że twoje rozwiązanie jest nowe i wymaga nowszej biblioteki wsparcia 25.4.0 i wyższej, ponieważ przy niższej wersji lib wsparcia ta klasa nie jest dostępna, więc nikt nie mógł jej znaleźć !! !! tak przy okazji, zredagowałem odpowiedź :) dzień dobry ...
tak, pracowałem też dla mnie, bez drugiego parametru .. to też może pójśćmImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem Muhammad
pozytywnie oceniany i bez drugiego parametru działa jak urok. Dzięki @ toobsco42
Ravi Vaniya
35
@Hardik ma rację. Innym błędem w kodzie jest odniesienie do koloru zdefiniowanego w XML. Przekazałeś tylko identyfikator do setColorFiltermetody, kiedy powinieneś użyć identyfikatora do zlokalizowania zasobu kolorów i przekazać zasób do setColorFiltermetody. Przepisz swój oryginalny kod poniżej.
W przeciwnym razie musisz odwołać się do swojej głównej działalności:
Activity main =...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
Zauważ, że dotyczy to również innych rodzajów zasobów, takich jak liczby całkowite, boole, wymiary itp. Z wyjątkiem łańcucha, do którego możesz bezpośrednio użyć getString()w swojej aktywności bez konieczności pierwszego połączenia getResources()(nie pytaj mnie dlaczego) .
W przeciwnym razie kod wygląda dobrze. (Chociaż nie badałem setColorFilterzbytnio tej metody ...)
Musiałem także zrobić, imageView.getBackground()aby uzyskać możliwość losowania, ponieważ zwracał imageView.getDrawable()zero.
Rock Lee
@RockLee upewnij się, że użyłeś src w widoku obrazu xml lub setImageResource w kodzie
orelzion
jest to idealny sposób na ustawienie koloru odcienia tła
podglądu obrazu
12
Lepsza uproszczona funkcja rozszerzenia dzięki ADev
fun ImageView.setTint(@ColorRes colorRes:Int){ImageViewCompat.setImageTintList(this,ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))}
Czy istnieje podobny odcień tekstu przycisku / TextView?
programista Androida
masz na myśli kolor tekstu lub odcień tekstu w widoku tekstowym do rysowania?
Manohar Reddy
Mam na myśli „odcień tekstu”. Kolor tekstu. Ale myślę, że jest to dość problematyczne, ponieważ tekst ma kolor dla każdego stanu ... Z drugiej strony, jak to działa, kiedy ustawiam kolor akcentu ... Dziwne ... Czy to możliwe, że można ustawić kolor akcentu na konkretny przycisk (lub TextView), programowo?
programista Androida
11
Jeśli kolor ma przezroczystość szesnastkową, użyj poniższego kodu.
Ponieważ pierwsza odpowiedź nie zadziałała dla mnie:
//get ImageViewImageView 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)));
Wydaje się, że działa to tylko w API 21+, ale dla mnie to nie był problem. Do rozwiązania tego problemu można użyć ImageViewCompat.
Począwszy od Lollipop, istnieje metoda o nazwie ImageView#setImageTintList(), której można użyć ... zaletą jest to, że zajmuje ona ColorStateListzamiast jednego koloru, dzięki czemu odcień obrazu jest rozpoznawany przez stan.
Na urządzeniach z wersją wcześniejszą niż Lollipop można uzyskać takie samo zachowanie, odbarwiając obszar do rysowania, a następnie ustawiając go jako ImageViewobraz do rysowania:
Dodając do ADev „s odpowiedź (co moim zdaniem jest najbardziej poprawne), od powszechnego przyjęcia Kotlin, a jej użytecznych funkcji rozszerzających:
fun ImageView.setTint(context:Context,@ColorRes colorId:Int){
val color =ContextCompat.getColor(context, colorId)
val colorStateList =ColorStateList.valueOf(color)ImageViewCompat.setImageTintList(this, colorStateList)}
Myślę, że jest to funkcja, która może być przydatna w każdym projekcie na Androida!
Jestem spóźniony na przyjęciu, ale nie widziałem powyżej mojego rozwiązania. Jesteśmy również w stanie ustawić kolor odcienia setImageResource()(moja minSdkVersion to 24).
Najpierw musisz utworzyć selektor i zapisać go w /drawablefolderze zasobów (nazywam to ic_color_white_green_search.xml)
<!-- Focused and not pressed --><itemandroid:state_focused="true"android:state_pressed="false"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Focused and pressed --><itemandroid:state_focused="true"android:state_pressed="true"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Default --><itemandroid:drawable="@drawable/ic_search"/>
Następnie ustaw go w taki sposób:
val icon = itemView.findViewById(R.id.icon)asImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)
Rozwiązanie Kotlin wykorzystujące funkcję rozszerzenia do ustawiania i wyłączania barwienia:
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))}
Ale to ostatecznie działa jak odcień. Powinieneś spróbować sam. To tylko jeden sposób patrzenia na rzeczy.
Shubham Chaudhary
@ShubhamChaudhary Wiem, że jest późno, ale co, jeśli obraz jest png. W takim razie tło się nie zmieni? Również alfa i odcień są bardzo różne. Odcień jest jak zamiana kolorów, jeśli się nie mylę. Żadne przestępstwo nie jest zamierzone. Próbuję tylko pomóc :)
KISHORE_ZE,
Ważny punkt Ta odpowiedź pomogła w moim przypadku. Nadzieja pasuje również do butów innych osób.
Odpowiedzi:
Możesz zmienić odcień, dość łatwo w kodzie poprzez:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
// biały odcieńJeśli chcesz odcień koloru, to
Do rysowania wektorowego
AKTUALIZACJA :
@ADev ma nowsze rozwiązanie w swojej odpowiedzi tutaj , ale jego rozwiązanie wymaga nowszej biblioteki wsparcia - 25.4.0 lub wyższej.
źródło
android:tint
działa na wszystkich wersjach Androida. Może mówisz odrawableTint
?Większość odpowiedzi odnosi się do używania,
setColorFilter
które nie jest tym, o co pierwotnie pytano.Użytkownik @Tad ma swoją odpowiedź we właściwym kierunku, ale działa tylko na API 21+.
Aby ustawić odcień we wszystkich wersjach Androida, użyj
ImageViewCompat
:Zauważ, że
yourTint
w tym przypadku musi być „int kolor”. Jeśli masz taki zasób koloruR.color.blue
, musisz najpierw załadować kolor int:źródło
ImageView
instancjach xml z kompozycją AppCompat lub naAppCompatImageView
podklasach.To zadziałało dla mnie
źródło
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik ma rację. Innym błędem w kodzie jest odniesienie do koloru zdefiniowanego w XML. Przekazałeś tylko identyfikator do
setColorFilter
metody, kiedy powinieneś użyć identyfikatora do zlokalizowania zasobu kolorów i przekazać zasób dosetColorFilter
metody. Przepisz swój oryginalny kod poniżej.Jeśli ten wiersz mieści się w Twojej aktywności:
W przeciwnym razie musisz odwołać się do swojej głównej działalności:
Zauważ, że dotyczy to również innych rodzajów zasobów, takich jak liczby całkowite, boole, wymiary itp. Z wyjątkiem łańcucha, do którego możesz bezpośrednio użyć
getString()
w swojej aktywności bez konieczności pierwszego połączeniagetResources()
(nie pytaj mnie dlaczego) .W przeciwnym razie kod wygląda dobrze. (Chociaż nie badałem
setColorFilter
zbytnio tej metody ...)źródło
Po wypróbowaniu wszystkich metod i one nie działały dla mnie.
Otrzymuję rozwiązanie za pomocą innego PortDuff.MODE.
źródło
Począwszy od Lollipop, istnieje również metoda odcień dla BitmapDrawables, która działa z nową klasą Palette:
i
W starszych wersjach Androida możesz teraz korzystać z biblioteki DrawableCompat
źródło
Spróbuj tego. Powinien działać na wszystkich wersjach Androida obsługiwanych przez bibliotekę wsparcia:
Możesz użyć dowolnego z powyższych, aby to działało.
O ciekawszych funkcjach DrawableCompat można przeczytać w dokumentacji tutaj .
źródło
imageView.getBackground()
aby uzyskać możliwość losowania, ponieważ zwracałimageView.getDrawable()
zero.Lepsza uproszczona funkcja rozszerzenia dzięki ADev
Stosowanie:-
źródło
Jeśli kolor ma przezroczystość szesnastkową, użyj poniższego kodu.
Aby usunąć odcień
źródło
img
jest typu ImageView.Prosta i jedna linia
źródło
Ponieważ pierwsza odpowiedź nie zadziałała dla mnie:
Wydaje się, że działa to tylko w API 21+, ale dla mnie to nie był problem. Do rozwiązania tego problemu można użyć ImageViewCompat.
Mam nadzieję, że pomogłem komukolwiek :-)
źródło
Począwszy od Lollipop, istnieje metoda o nazwie
ImageView#setImageTintList()
, której można użyć ... zaletą jest to, że zajmuje onaColorStateList
zamiast jednego koloru, dzięki czemu odcień obrazu jest rozpoznawany przez stan.Na urządzeniach z wersją wcześniejszą niż Lollipop można uzyskać takie samo zachowanie, odbarwiając obszar do rysowania, a następnie ustawiając go jako
ImageView
obraz do rysowania:źródło
źródło
Do ustawiania odcienia dla widoku obrazu programowo w Androidzie
Mam dwie metody dla Androida:
1)
2)
Mam nadzieję, że pomogłem komukolwiek :-)
źródło
Dodając do ADev „s odpowiedź (co moim zdaniem jest najbardziej poprawne), od powszechnego przyjęcia Kotlin, a jej użytecznych funkcji rozszerzających:
Myślę, że jest to funkcja, która może być przydatna w każdym projekcie na Androida!
źródło
Zauważyłem, że możemy użyć selektora kolorów dla atrybutu tint:
activity_main.xml:
section_arrowup_color.xml:
źródło
app:srcCompat
zamiastandroid:src
i dodajvectorDrawables.useSupportLibrary = true
dodefaultConfig
części pliku build.gradle. Przetestowano pod kątem poprawnego działania na emulatorze KitKat.Nie używaj
PoterDuff.Mode
, użyjsetColorFilter()
działa dla wszystkich.źródło
Jak powiedział @mosmosmns, powinieneś użyć
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Ten interfejs API wymaga wartości koloru zamiast identyfikatora zasobu koloru. Jest to główna przyczyna, dla której twoje polecenie nie działa.
źródło
Jestem spóźniony na przyjęciu, ale nie widziałem powyżej mojego rozwiązania. Jesteśmy również w stanie ustawić kolor odcienia
setImageResource()
(moja minSdkVersion to 24).Najpierw musisz utworzyć selektor i zapisać go w
/drawable
folderze zasobów (nazywam toic_color_white_green_search.xml
)Następnie ustaw go w taki sposób:
źródło
W przypadku, gdy chcesz ustawić selektor na swój odcień:
źródło
Rozwiązanie Kotlin wykorzystujące funkcję rozszerzenia do ustawiania i wyłączania barwienia:
źródło
Nie dokładna odpowiedź, ale prostsza alternatywa:
Oto fragment tego:
źródło
png
. W takim razie tło się nie zmieni? Również alfa i odcień są bardzo różne. Odcień jest jak zamiana kolorów, jeśli się nie mylę. Żadne przestępstwo nie jest zamierzone. Próbuję tylko pomóc :)