Eu estou tentando fazer uma função quadro geral que faz qualquer Drawable tornar-se realçado quando pressionado / focalizado / selecionada / etc .
Minha função pega um Drawable e retorna um StateListDrawable, onde o estado padrão é o próprio Drawable, e o estado para android.R.attr.state_pressed
é o mesmo drawable, apenas com um filtro aplicado usando setColorFilter
.
Meu problema é que não consigo clonar o drawable e fazer uma instância separada dele com o filtro aplicado. Aqui está o que estou tentando alcançar:
StateListDrawable makeHighlightable(Drawable drawable)
{
StateListDrawable res = new StateListDrawable();
Drawable clone = drawable.clone(); // how do I do this??
clone.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
res.addState(new int[] {android.R.attr.state_pressed}, clone);
res.addState(new int[] { }, drawable);
return res;
}
Se eu não clonar, o filtro será obviamente aplicado a ambos os estados. Tentei brincar mutate()
mas não adiantou ..
Alguma ideia?
Atualizar:
A resposta aceita de fato clona um drawable. Mas isso não me ajudou porque minha função geral falha em um problema diferente. Parece que quando você adiciona um drawable a um StateList, ele perde todos os seus filtros.
fonte
ImageView.setImageDrawable
, que consegui contornar graças à resposta aceita.Respostas:
Experimente o seguinte:
fonte
.mutate()
(veja minha resposta).Se você aplicar um filtro / etc a um drawable criado com,
getConstantState().newDrawable()
então todas as instâncias desse drawable também serão alteradas, já que os drawables usam oconstantState
como cache!Portanto, se você colorir um círculo usando um filtro de cores e um
newDrawable()
, você mudará a cor de todos os círculos.Se você quiser tornar esse drawable atualizável sem afetar outras instâncias, deverá alterar esse estado constante existente.
Para uma boa explicação, consulte:
http://www.curious-creature.org/2009/05/02/drawable-mutations/
http://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate ()
fonte
Isto é o que funciona para mim.
fonte
Esta é a minha solução, com base nesta pergunta do SO .
A ideia é
ImageView
obter um filtro de cor quando o usuário o tocar e o filtro de cor seja removido quando o usuário parar de tocá-lo. Apenas 1 drawable / bitmap está na memória, então não há necessidade de desperdiçá-lo. Funciona como deveria.uso:
fonte
Eu respondi uma questão relacionada aqui
Basicamente, parece que StateListDrawables realmente perdem seus filtros. Criei um novo BitmapDrawale a partir de uma cópia alterada do Bitmap que originalmente queria usar.
fonte
no caso de
getConstantState()
devoluçõesnull
.fonte
Obtenha o drawable clone usando,
newDrawable()
mas certifique-se de que é mutável, caso contrário, seu efeito de clone se foi, usei essas poucas linhas de código e está funcionando conforme o esperado.getConstantState()
pode ser nulo, conforme sugerido pela anotação, portanto, manuseie esta RunTimeException ao clonar drawable.fonte