Estou editando para tornar a pergunta mais simples, esperando que ajude a obter uma resposta precisa.
Digamos que tenho a seguinte oval
forma:
<?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>
Como defino a cor de forma programática, de dentro de uma classe de atividade?
android
android-layout
shape
Cote Mounyo
fonte
fonte
oval
e é o plano de fundo de um ImageView.View
classe e usando-a como abase
exibição em um layout que permite a sobreposição de widgets (RelativeLayout
,FrameLayout
). Dentro dessaView
classe estendida , você podedraw multiple images onto a canvas
. Mas, antes de fazer isso, dê uma olhada neste -> Link (se você ainda não o fez).Respostas:
Nota : A resposta foi atualizada para cobrir o cenário em que
background
é uma instânciaColorDrawable
. Obrigado Tyler Pfaff , por apontar isso.Obter o
Drawable
deimageView
usargetBackground()
:Verifique contra suspeitos comuns:
Versão compacta:
Observe que a verificação nula não é necessária.
No entanto, você deve usar
mutate()
os desenhistas antes de modificá-los, se eles forem usados em outros lugares. (Por padrão, os drawables carregados do XML compartilham o mesmo estado.)fonte
solid
parte da forma. E astroke
porção?@username
seu comentário para garantir que uma notificação seja enviada ao usuário. A propósito, você precisará subclassificarShapeDrawable
para definir a parte do traçado. Mais informações aqui: Link . Veja o comentário, que menciona um problema com a resposta aceita.ImageView's
plano de fundo estiver definido como aGradientDrawable
,getBackground()
não retornará aShapeDrawable
. Em vez disso, use oGradientDrawable
que é retornado:GradientDrawable gradientDrawable = (GradientDrawable)imageView.getBackground();
....gradientDrawable.setColors(new int[] { color1, color2 });
.Faça assim:
fonte
android:background
seu xml ou até mesmo umasetBackground
atividade antes de ligargetBackground()
? Deveria funcionar se você o tivesse feito.Uma solução mais simples hoje em dia seria usar sua forma como plano de fundo e depois mudar programaticamente sua cor via:
Consulte PorterDuff.Mode para obter as opções disponíveis.
ATUALIZAÇÃO (API 29):
O método acima foi descontinuado desde a API 29 e substituído pelo seguinte:
Veja BlendMode para as opções disponíveis.
fonte
view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP);
Como pode haver uma borda no fundo ou em couriers arredondados.getBackground()
ligação. Meu imageview.src continha uma forma e eu usei:imageIndicator.setColorFilter(toggleColor, PorterDuff.Mode.SRC_ATOP);
wheretoggleColor
é apenas um int que anteriormente armazenava o resultado de getColor ()PorterDuff.Mode
paraBlendModeColorFilter
não será compilado conforme necessárioBlendMode
. Assim, para a API 29, deveria serview.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)
.Tente o seguinte:
para mais detalhes, verifique este link neste
espero ajuda.
fonte
espero que isso ajude alguém com o mesmo problema
fonte
gd.setStroke(width_px, Color.parseColor("#FF5722"));
Expandindo a resposta de Vikram , se você estiver colorindo visualizações dinâmicas, como itens de visualização de recicladores, etc .... Então provavelmente desejará chamar mutate () antes de definir a cor. Se você não fizer isso, qualquer vista que tenha um desenho comum (ou seja, um plano de fundo) também terá seu desenho alterado / colorido.
fonte
if (background instanceof LayerDrawable) { background = ((LayerDrawable) background.mutate()).getDrawable(indexIfLayerDrawable); } if (background instanceof ShapeDrawable)[...]
para lidar com os layouts de plano de fundo usados<layer-list ... <item ...
.Esta pergunta foi respondida há um tempo, mas pode ser modernizada reescrevendo como uma função de extensão kotlin.
fonte
esta é a solução que funciona para mim ... também escrevi em outra pergunta: Como mudar a cor da forma dinamicamente?
fonte
Nada funciona para mim, mas quando eu defino a cor da tonalidade, ele funciona no Shape Drawable
requer Android 5.0 API 21
fonte
Minha versão da função de extensão Kotlin com base nas respostas acima com Compat :
fonte
A maneira simples de preencher a forma com o Radius é:
fonte
Talvez seja tarde demais, mas se você estiver usando o Kotlin. Existe uma maneira como esta
Aproveitar....
fonte
Para quem usa o C # Xamarin, aqui está um método baseado no snippet do Vikram:
fonte