Edytuję, aby uprościć pytanie, mając nadzieję, że pomoże to w uzyskaniu dokładnej odpowiedzi.
Powiedz, że mam następujący oval
kształt:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:angle="270"
android:color="#FFFF0000"/>
<stroke android:width="3dp"
android:color="#FFAA0055"/>
</shape>
Jak programowo ustawić kolor z poziomu klasy aktywności?
android
android-layout
shape
Cote Mounyo
źródło
źródło
oval
i jest tłem ImageView.View
klasę i używając jej jakobase
widoku w układzie, który umożliwia nakładanie się widżetów (RelativeLayout
,FrameLayout
). W tej rozszerzonejView
klasie możeszdraw multiple images onto a canvas
. Ale zanim to zrobisz, spójrz na to -> Link (jeśli jeszcze tego nie zrobiłeś).Odpowiedzi:
Uwaga : odpowiedź została zaktualizowana, aby uwzględnić scenariusz, w którym
background
występuje wystąpienieColorDrawable
. Dzięki Tyler Pfaff za wskazanie tego.Uzyskać
Drawable
zimageView
użyciemgetBackground()
:Sprawdź przeciwko zwykłym podejrzanym:
Wersja kompaktowa:
Należy pamiętać, że sprawdzanie wartości null nie jest wymagane.
Jednak powinieneś użyć
mutate()
na drawables przed ich modyfikacją, jeśli są używane gdzie indziej. (Domyślnie elementy rysunkowe ładowane z XML mają ten sam stan).źródło
solid
część kształtu. A co zstroke
porcją?@username
swój komentarz, aby upewnić się, że powiadomienie zostanie wysłane do użytkownika. Nawiasem mówiąc, będziesz musiał przejść podklasęShapeDrawable
, aby ustawić część obrysu. Więcej informacji tutaj: Link . Spójrz na komentarz, ponieważ wspomina o problemie z zaakceptowaną odpowiedzią.ImageView's
tło jest ustawione na aGradientDrawable
,getBackground()
nie zwróci aShapeDrawable
. Zamiast tego należy użyćGradientDrawable
, który jest zwracany:GradientDrawable gradientDrawable = (GradientDrawable)imageView.getBackground();
....gradientDrawable.setColors(new int[] { color1, color2 });
.Rób jak to:
źródło
android:background
swój plik XML, a nawetsetBackground
aktywność, zanim zadzwoniłeśgetBackground()
? Powinno działać, gdybyś to zrobił.W dzisiejszych czasach prostszym rozwiązaniem byłoby użycie kształtu jako tła, a następnie programowa zmiana jego koloru poprzez:
Aby zapoznać się z dostępnymi opcjami, zobacz PorterDuff.Mode .
AKTUALIZACJA (API 29):
Powyższa metoda jest przestarzała od API 29 i zastąpiona następującą:
Aby zapoznać się z dostępnymi opcjami, zobacz BlendMode .
źródło
view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP);
ponieważ w tle może znajdować się obramowanie lub zaokrąglone pola.getBackground()
połączenie. Mój imageview.src zawierał kształt i użyłem:imageIndicator.setColorFilter(toggleColor, PorterDuff.Mode.SRC_ATOP);
gdzietoggleColor
jest po prostu int, który poprzednio przechował wynik z getColor ()PorterDuff.Mode
forBlendModeColorFilter
nie kompiluje się tak, jak tego wymagaBlendMode
. Więc dla API 29 powinno byćview.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)
.Spróbuj tego:
Więcej szczegółów sprawdź ten link to
mam nadzieję, że pomoże.
źródło
mam nadzieję, że to pomoże komuś z tym samym problemem
źródło
gd.setStroke(width_px, Color.parseColor("#FF5722"));
Rozszerzając odpowiedź Vikrama , jeśli kolorujesz dynamiczne widoki, takie jak elementy widoku recyklera, itp. .... Wtedy prawdopodobnie będziesz chciał wywołać mutate () przed ustawieniem koloru. Jeśli tego nie zrobisz, wszystkie widoki, które mają wspólny element do rysowania (tj. Tło), również zostaną zmienione / pokolorowane.
źródło
if (background instanceof LayerDrawable) { background = ((LayerDrawable) background.mutate()).getDrawable(indexIfLayerDrawable); } if (background instanceof ShapeDrawable)[...]
aby poradzić sobie z układami tła, które używają<layer-list ... <item ...
.Na to pytanie odpowiedziano jakiś czas temu, ale można je zmodernizować, przepisując jako funkcję rozszerzenia kotlin.
źródło
to jest rozwiązanie, które u mnie działa ... napisałam też w innym pytaniu: Jak dynamicznie zmieniać kształt kolorystyczny?
źródło
Nic nie działa dla mnie, ale kiedy ustawię odcień, działa to na Shape Drawable
wymaga Android 5.0 API 21
źródło
Moja wersja funkcji rozszerzenia Kotlin oparta na odpowiedziach powyżej z Compat :
źródło
Prosty sposób wypełnienia kształtu promieniem to:
źródło
Może jestem za późno, ale jeśli używasz Kotlina. Jest taki sposób
Cieszyć się....
źródło
Dla każdego, kto używa języka C # Xamarin, oto metoda oparta na fragmencie Vikrama:
źródło