Korzystam z biblioteki obsługi Androida v21.
Utworzyłem przycisk z niestandardowym kolorem tła. Efekty projektowania materiałów, takie jak marszczenie, odsłanianie, znikają (oprócz elewacji po kliknięciu), gdy używam koloru tła.
<Button
style="?android:attr/buttonStyleSmall"
android:background="?attr/colorPrimary"
android:textColor="@color/white"
android:textAllCaps="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button1"
/>
Poniżej znajduje się normalny przycisk, a efekty działają dobrze.
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAllCaps="true"
android:text="Button1"
/>
android
android-5.0-lollipop
Sathesh
źródło
źródło
Odpowiedzi:
Podczas używania
android:background
zamieniasz większość stylizacji i wyglądu przycisku na pusty kolor.Aktualizacja: W tej wersji 23.0.0 zwolnienia z AppCompat , pojawił się nowy
Widget.AppCompat.Button.Colored
styl, który wykorzystuje swoją motywucolorButtonNormal
dla niepełnosprawnych koloru icolorAccent
dla włączonego koloru.Pozwala to zastosować go bezpośrednio do przycisku
Jeśli potrzebujesz niestandardowego
colorButtonNormal
lubcolorAccent
, możesz użyć narzędziaThemeOverlay
opisanego w tym poradniku iandroid:theme
na przycisku.Poprzednia odpowiedź
Możesz użyć rysowania w katalogu v21 dla swojego tła, takiego jak:
Zapewni to
?attr/colorPrimary
domyślny kolor tła i domyślną animację tętnienia przy użyciu domyślnej?attr/colorControlHighlight
(którą możesz również ustawić w motywie, jeśli chcesz).Uwaga: musisz utworzyć niestandardowy selektor dla wersji mniejszej niż 21:
Zakładając, że masz kilka kolorów, które chcesz ustawić w stanie domyślnym, wciśniętym i skupionym. Osobiście zrobiłem zrzut ekranu tętnienia w połowie drogi i zostałem z tego wyciągnięty stan podstawowy / skupiony.
źródło
Istnieje inne proste rozwiązanie polegające na zapewnieniu niestandardowego tła dla przycisków „płaskich”, przy jednoczesnym zachowaniu ich efektów „materiałowych”.
tj .:
Może być użyty do płaskich przycisków, działa na API> = 11, a otrzymasz efekt tętnienia na urządzeniach> = 21, utrzymując zwykłe przyciski na wersjach wcześniejszych niż 21, dopóki AppCompat nie zostanie zaktualizowany, aby obsługiwał również tam tętnienie.
Możesz także użyć selectableItemBackgroundBorderless tylko dla przycisków> = 21.
źródło
CardView
podejściu, dziękuję za udostępnienie!Oto prosty i kompatybilny wstecz sposób, aby zapewnić efekt falowania podniesionym przyciskom z niestandardowym tłem.
Twój układ powinien wyglądać tak
źródło
foreground
nie działa przed 23. google.com/…Natknąłem się na ten problem dzisiaj, grając z biblioteką v22.
Zakładając, że używasz stylów, możesz ustawić
colorButtonNormal
właściwość, a przyciski będą domyślnie używać tego koloru.Poza tym nadal możesz stworzyć styl dla przycisku, a następnie użyć go dla każdego przycisku, jeśli potrzebujesz asortymentu kolorów (nie testowałem, tylko spekulujesz).
Pamiętaj, aby dodać
android:
przed nazwami elementów w swoim stylu v21 .źródło
Za pomocą AppCompat (22.1.1+) możesz dodać taki styl:
I użyj go, po prostu stosując styl:
Programowo zmieniając kolor, odkryłem, że jedynym sposobem na aktualizację koloru (w API 15 lub 16) było użycie zamiast tego „listy odcieni tła”. I nie usuwa ładnej animacji radialnej na urządzeniach API 21:
Ponieważ
button.setBackground(...)
ibutton.getBackground().mutate().setColorFilter(...)
nie zmieniaj koloru przycisku w API 15 i 16, tak jak w API 21.źródło
ColorStateList.valueOf( ... )
aby skonstruować prostyColorStateList
tylko jeden kolor.ViewCompat.setBackgroundTintList(myButton, ColorStateList.valueOf(myColor);
Javadoc dlasetSupportBackgroundTintList
mówi, że należy to tak nazwać.Odpowiedź @ ianhanniballake jest absolutnie poprawna i prosta. Ale zrozumienie zajęło mi kilka dni. Dla kogoś, kto nie rozumie jego odpowiedzi, oto bardziej szczegółowe wdrożenie
=== Lub ===
źródło
colorButtonNormal
w temacie podstawowym@style/AppTheme
. To nadaje domyślny kolor AppCompat, aby odpowiednio pokolorować przyciski. A potem możesz użyć swojej odpowiedzi, aby indywidualnie stworzyć motyw widoku.android:theme="Theme.MaterialButton"
lubandroid:theme="@style/Theme.MaterialButton"
android:theme="@style/Theme.MaterialButton"
. Dziękuję za twoją poprawność.Użyłem tła i pierwszego planu:
źródło
Przyszedłem do tego postu, szukając sposobu, aby uzyskać kolor tła mojego
ListView
przedmiotu, a jednocześnie zachować falę.Po prostu dodałem swój kolor jako tło i selectableItemBackground jako pierwszy plan:
i działa jak urok. Wydaje mi się, że ta sama technika może być zastosowana również do przycisków. Powodzenia :)
źródło
Użyj
backgroundTint
zamiastbackground
źródło
Jeśli interesuje Cię ImageButton, możesz wypróbować tę prostą rzecz:
źródło
v22.1
odappcompat-v7
wprowadzono kilka nowych możliwości. Teraz możliwe jest przypisanie określonego motywu tylko do jednego widoku.Zamiast ustawiać pożądany kolor w motywie globalnym, tworzymy nowy i przypisujemy go tylko do
Button
Przykład:
I użyj tego stylu jako motywu swojego
Button
źródło
Jeśli nie masz nic przeciwko korzystaniu z biblioteki innej firmy, sprawdź traex / RippleEffect . Pozwala dodać efekt Ripple do KAŻDEGO widoku za pomocą zaledwie kilku linii kodu. Trzeba tylko owinąć w pliku układu xml element, który ma wywoływać efekt marszczenia z
com.andexert.library.RippleView
kontenerem.Jako dodatkowy bonus wymaga Min SDK 9, abyś mógł zachować spójność projektu we wszystkich wersjach systemu operacyjnego.
Oto przykład zaczerpnięty z repozytorium GitHub bibliotek:
Możesz zmienić kolor tętnienia, dodając ten atrybut element RippleView:
app:rv_color="@color/my_fancy_ripple_color
źródło
Posługiwać się
a kolor zaakceptuje pre-lolipop
źródło
Istnieją dwa podejścia wyjaśnione we wspaniałym samouczku autorstwa Alexa Lockwooda: http://www.androiddesignpatterns.com/2016/08/coloring-buttons-with-themeoverlays-background-tints.html :
Podejście nr 1: Modyfikacja koloru tła przycisku w / ThemeOverlay
Podejście nr 2: Ustawianie odcienia tła AppCompatButton
źródło
Programowe stosowanie kolorów:
źródło
Próbowałem tego:
zamiast zmiany właściwości tła. Nie usuwa to efektu materialnego.
źródło