Estou usando a biblioteca de suporte do Android v21.
Eu criei um botão com a cor de fundo personalizada. Os efeitos de design do material, como ondulação e revelação, desapareceram (exceto a elevação ao clicar) quando uso a cor de fundo do terreno.
<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"
/>
A seguir, é um botão normal e os efeitos estão funcionando bem.
<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
fonte
fonte
Respostas:
Ao usar
android:background
, você substitui grande parte do estilo e aparência de um botão por uma cor em branco.Atualização: a partir da versão 23.0.0 do AppCompat , existe um novo
Widget.AppCompat.Button.Colored
estilo que usa os temascolorButtonNormal
para a cor desativada ecolorAccent
para a cor ativada.Isso permite que você o aplique diretamente no botão via
Se você precisar de um personalizado
colorButtonNormal
oucolorAccent
, poderá usar umThemeOverlay
como explicado nesta dica profissional eandroid:theme
no botão.Resposta Anterior
Você pode usar um drawable em seu diretório v21 para o seu plano de fundo, como:
Isso garantirá que a cor do plano de fundo seja
?attr/colorPrimary
e tenha a animação de ondulação padrão usando o padrão?attr/colorControlHighlight
(que você também pode definir no seu tema, se desejar).Nota: você precisará criar um seletor personalizado para menos de v21:
Supondo que você tenha algumas cores desejadas para o estado padrão, pressionado e focado. Pessoalmente, tirei uma captura de tela de uma onda no meio da seleção e tirei o estado primário / focado disso.
fonte
Existe outra solução simples para fornecer plano de fundo personalizado para os botões "Planas", mantendo os efeitos "Materiais".
ou seja:
Pode ser usado para botões simples , funciona na API> = 11 e você terá efeito de ondulação em dispositivos = 21, mantendo os botões regulares antes dos 21 anos até que o AppCompat seja atualizado para suportar ondulações também.
Você também pode usar selectableItemBackgroundBorderless somente para> = 21 botões.
fonte
CardView
abordagem, obrigado por compartilhar!Aqui está uma maneira simples e compatível com versões anteriores de fornecer efeito cascata a botões elevados com o plano de fundo personalizado.
Seu layout deve ficar assim
fonte
foreground
não tem efeito antes de 23. google.com/…Encontrei esse problema hoje, na verdade, brincando com a biblioteca v22.
Supondo que você esteja usando estilos, você pode definir a
colorButtonNormal
propriedade e os botões usarão essa cor por padrão.Fora isso, você ainda pode criar um estilo para o botão e usá-lo por botão se precisar de uma variedade de cores (não testei, apenas especulei).
Lembre-se de adicionar
android:
antes dos nomes dos itens no seu estilo v21 .fonte
Com AppCompat (22.1.1+), você pode adicionar um estilo como este:
E use-o apenas aplicando o estilo:
Alterando programaticamente a cor, descobri que a única maneira de atualizar a cor (na API 15 ou 16) era usar a 'lista de tonalidades de fundo'. E não remove a bela animação radial nos dispositivos da API 21:
Porque
button.setBackground(...)
ebutton.getBackground().mutate().setColorFilter(...)
não altere a cor do botão na API 15 e 16 como na API 21.fonte
ColorStateList.valueOf( ... )
para construir um simplesColorStateList
de apenas uma cor.ViewCompat.setBackgroundTintList(myButton, ColorStateList.valueOf(myColor);
Javadoc parasetSupportBackgroundTintList
diz que deve ser assim chamado.A resposta do @ianianniballake é absolutamente correta e simples. Mas levei alguns dias para entender. Para alguém que não entende sua resposta, aqui está uma implementação mais detalhada
=== Ou ===
fonte
colorButtonNormal
no tema base@style/AppTheme
. Isso fornece uma cor padrão ao AppCompat para colorir os botões adequadamente. E então você pode usar sua resposta para criar um tema individualmente.android:theme="Theme.MaterialButton"
orandroid:theme="@style/Theme.MaterialButton"
android:theme="@style/Theme.MaterialButton"
. Obrigado pela sua correção.Eu usei o backgroundTint e o primeiro plano:
fonte
Eu vim para este post procurando uma maneira de ter uma cor de plano de fundo do meu
ListView
item, mas manter a ondulação.Simplesmente adicionei minha cor como plano de fundo e o selectableItemBackground como primeiro plano:
E funciona como um encanto. Eu acho que a mesma técnica também pode ser usada para botões. Boa sorte :)
fonte
Use em
backgroundTint
vez debackground
fonte
Se você está interessado no ImageButton, pode tentar o seguinte:
fonte
v22.1
deappcompat-v7
introduziu algumas novas possibilidades. Agora é possível atribuir um tema específico apenas a uma visualização.Portanto, em vez de definir a cor desejada em um tema global, criamos um novo e atribuímos apenas ao
Button
Exemplo:
E use esse estilo como tema do seu
Button
fonte
Se você estiver bem com o uso de uma biblioteca de terceiros, consulte traex / RippleEffect . Permite adicionar um efeito cascata a QUALQUER visualização com apenas algumas linhas de código. Você só precisa agrupar, em seu arquivo de layout xml, o elemento que deseja que tenha um efeito cascata com um
com.andexert.library.RippleView
contêiner.Como um bônus adicional, requer o SDK 9 mínimo, para que você possa ter consistência de design nas versões do sistema operacional.
Aqui está um exemplo retirado do repositório GitHub das bibliotecas:
Você pode alterar a cor da ondulação adicionando esse atributo ao elemento RippleView:
app:rv_color="@color/my_fancy_ripple_color
fonte
Usar
e a cor será aceita no pré-lolipop
fonte
Há duas abordagens explicadas no ótimo tutorial: Alex Lockwood: http://www.androiddesignpatterns.com/2016/08/coloring-buttons-with-themeoverlays-background-tints.html :
Abordagem 1: Modificando a cor de fundo do botão com um ThemeOverlay
Abordagem nº 2: definindo a tonalidade de segundo plano do AppCompatButton
fonte
Aplicando programaticamente as cores:
fonte
Eu tentei isso:
em vez de alterar a propriedade em segundo plano. Isso não remove o efeito material.
fonte