Preciso definir tonalidade para uma visualização de imagem ... Estou usando da seguinte maneira:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
Mas isso não muda ...
Preciso definir tonalidade para uma visualização de imagem ... Estou usando da seguinte maneira:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
Mas isso não muda ...
Respostas:
Você pode alterar a tonalidade facilmente no código via:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
// Matiz branco
Se você quiser tonalidade de cor,
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);
Para vetor Drawable
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);
ATUALIZAÇÃO : O
@ADev possui uma solução mais nova em sua resposta aqui , mas sua solução requer uma biblioteca de suporte mais recente - 25.4.0 ou superior.
android:tint
funciona em todas as versões do Android. Talvez você esteja falando drawableTint
?
A maioria das respostas se refere ao uso setColorFilter
que não é o que foi originalmente solicitado.
O usuário @Tad tem sua resposta na direção certa, mas funciona apenas na API 21+.
Para definir a tonalidade em todas as versões do Android, use o ImageViewCompat
:
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));
Observe que yourTint
, nesse caso, deve ser uma "cor int". Se você possui um recurso de cores R.color.blue
, precisa primeiro carregar a cor int:
ContextCompat.getColor(context, R.color.blue);
ImageView
instâncias xml com o tema AppCompat ou em AppCompatImageView
subclasses.
Isso funcionou para mim
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik está certo. O outro erro no seu código ocorre quando você faz referência à cor definida pelo XML. Você passou apenas o ID para o setColorFilter
método, quando deveria usá-lo para localizar o recurso de cores e passar o recurso para o métodosetColorFilter
método. Reescrevendo seu código original abaixo.
Se esta linha estiver dentro da sua atividade:
imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
Caso contrário, você precisa fazer referência à sua atividade principal:
Activity main = ...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
Observe que isso também se aplica a outros tipos de recursos, como números inteiros, bools, dimensões, etc. Exceto pela string, para a qual você pode usar diretamente getString()
em sua Atividade sem a necessidade de ligar primeiro.getResources()
(não me pergunte por que) .
Caso contrário, seu código ficará bem. (Embora eu não tenha investigado setColorFilter
muito o método ...)
A partir do Lollipop, também existe um método de tonalidade para o BitmapDrawables que funciona com a nova classe Palette:
público vazio setTintList (tonalidade ColorStateList)
e
public void setTintMode (PorterDuff.Mode tintMode)
Nas versões mais antigas do Android, agora você pode usar a biblioteca DrawableCompat
Tente isso. Ele deve funcionar em todas as versões do Android suportadas pela biblioteca de suporte:
public static Drawable getTintedDrawableOfColorResId(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorRes int colorResId) {
return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), ContextCompat.getColor(context, colorResId));
}
public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorInt int color) {
return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), color);
}
public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Drawable inputDrawable, @ColorInt int color) {
Drawable wrapDrawable = DrawableCompat.wrap(inputDrawable);
DrawableCompat.setTint(wrapDrawable, color);
DrawableCompat.setTintMode(wrapDrawable, PorterDuff.Mode.SRC_IN);
return wrapDrawable;
}
Você pode usar qualquer um dos itens acima para fazê-lo funcionar.
Você pode ler sobre os recursos mais interessantes do DrawableCompat nos documentos, aqui .
imageView.getBackground()
para obter o drawable, porque imageView.getDrawable()
estava retornando nulo.
Melhor função de extensão simplificada graças ao ADev
fun ImageView.setTint(@ColorRes colorRes: Int) {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}
Uso:-
imageView.setTint(R.color.tintColor)
Se sua cor tiver transparência hexadecimal, use o código abaixo.
ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));
Para limpar a tonalidade
ImageViewCompat.setImageTintList(imageView, null);
img
é do tipo ImageView.
Simples e uma linha
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
Como a primeira resposta não funcionou para mim:
//get ImageView
ImageView myImageView = (ImageView) findViewById(R.id.iv);
//colorid is the id of a color defined in values/colors.xml
myImageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.colorid)));
Isso parece funcionar apenas na API 21+, mas para mim isso não foi um problema. Você pode usar um ImageViewCompat para resolver esse problema.
Espero ter ajudado alguém :-)
A partir do Lollipop, existe um método chamado ImageView#setImageTintList()
que você pode usar ... a vantagem é que ele leva um ColorStateList
oposto a apenas uma única cor, tornando a tonalidade da imagem sensível ao estado.
Nos dispositivos pré-pirulito, você pode obter o mesmo comportamento pintando o drawable e, em seguida, definindo-o como o ImageView
drawable da imagem:
ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);
Random random=new Random;
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
ColorFilter cf = new PorterDuffColorFilter(Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255)),Mode.OVERLAY);
imageView.setImageResource(R.drawable.ic_bg_box);
imageView.setColorFilter(cf);
Para definir tonalidade para uma imagem vista programaticamente no android
Eu tenho dois métodos para o Android:
1)
imgView.setColorFilter(context.getResources().getColor(R.color.blue));
2)
DrawableCompat.setTint(imgView.getDrawable(),
ContextCompat.getColor(context, R.color.blue));
Espero ter ajudado alguém :-)
Somando-se ADEV 's resposta (que na minha opinião é o mais correto), desde a adopção generalizada de Kotlin, e as suas funções de extensão úteis:
fun ImageView.setTint(context: Context, @ColorRes colorId: Int) {
val color = ContextCompat.getColor(context, colorId)
val colorStateList = ColorStateList.valueOf(color)
ImageViewCompat.setImageTintList(this, colorStateList)
}
Eu acho que essa é uma função que pode ser útil em qualquer projeto do Android!
Descobri que podemos usar o seletor de cores para o atributo tint:
mImageView.setEnabled(true);
activity_main.xml:
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_arrowup"
android:tint="@color/section_arrowup_color" />
section_arrowup_color.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/white" android:state_enabled="true"/>
<item android:color="@android:color/black" android:state_enabled="false"/>
<item android:color="@android:color/white"/>
</selector>
app:srcCompat
vez de android:src
e adicione vectorDrawables.useSupportLibrary = true
na defaultConfig
parte do seu arquivo build.gradle. Testado para funcionar bem no emulador Kitkat.
Não use PoterDuff.Mode
, use setColorFilter()
funciona para todos.
ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));
Como @milosmns disse, você deve usar
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Essa API precisa de um valor de cor em vez do ID do recurso de cores. Essa é a causa principal da razão pela qual sua declaração não funcionou.
Estou atrasado na festa, mas não vi minha solidão acima. Também podemos definir a cor da tonalidade setImageResource()
(meu minSdkVersion é 24).
Então, primeiro, você precisa criar um seletor e salvá-lo na /drawable
pasta de ativos (eu chamo de ic_color_white_green_search.xml
)
<!-- Focused and not pressed -->
<item android:state_focused="true"
android:state_pressed="false">
<bitmap android:src="@drawable/ic_search"
android:tint="@color/branding_green"/>
</item>
<!-- Focused and pressed -->
<item android:state_focused="true"
android:state_pressed="true">
<bitmap android:src="@drawable/ic_search"
android:tint="@color/branding_green"/>
</item>
<!-- Default -->
<item android:drawable="@drawable/ic_search"/>
Em seguida, defina-o em código como este:
val icon = itemView.findViewById(R.id.icon) as ImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)
Caso você queira definir o seletor para a sua tonalidade:
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
Solução Kotlin usando a função de extensão, para definir e desabilitar a coloração:
fun ImageView.setTint(@ColorInt color: Int?) {
if (color == null) {
ImageViewCompat.setImageTintList(this, null)
return
}
ImageViewCompat.setImageTintMode(this, PorterDuff.Mode.SRC_ATOP)
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(color))
}
Resposta não exata, mas uma alternativa mais simples:
Aqui está um trecho para isso:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_height="@dimen/height120"
android:contentDescription="@string/my_description"
android:scaleType="fitXY"
android:src="@drawable/my_awesome_image"/>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/height120"
android:alpha="0.5"
android:background="@color/my_blue_color"/>
</FrameLayout>
png
. Então o fundo não mudará? Alfa e matiz também são muito diferentes. Matiz É como substituição de cor, se não estiver errado. Nenhuma ofensa pretendida. Apenas tentando ajudar :)