studio - manual de programacion android pdf
¿Cómo configurar tinte para una vista de imagen mediante programación en Android? (16)
Necesito establecer tinte para una vista de imagen ... Lo estoy usando de la siguiente manera:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
Pero eso no cambia ...
@Hardik lo tiene bien. El otro error en su código es cuando hace referencia a su color definido por XML. Pasó solo el ID al método setColorFilter
, cuando debería usar la ID para ubicar el recurso de color, y pase el recurso al método setColorFilter
. Reescriba su código original a continuación.
Si esta línea está dentro de su actividad:
imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
Si no, necesitas hacer referencia a tu actividad principal:
Activity main = ...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
Tenga en cuenta que esto también se aplica a los otros tipos de recursos, como enteros, bools, dimensiones, etc. Excepto por la cadena, para la cual puede usar directamente getString()
en su Actividad sin la necesidad de llamar primero a getResources()
(don No me preguntes por qué).
De lo contrario, su código se ve bien. (Aunque no he investigado demasiado el método setColorFilter
...)
A partir de Lollipop, existe un método llamado ImageView#setImageTintList()
que puede usar ... la ventaja es que toma una ColorStateList
en lugar de un solo color, lo que hace que el tinte de la imagen sea consciente del estado.
En los dispositivos pre-Lollipop, puede obtener el mismo comportamiento tiñendo el dibujo y luego configurándolo como el ImageView
de la imagen de ImageView
:
ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);
A partir de Lollipop, también hay un método de tint para BitmapDrawables que funciona con la nueva clase de paleta:
public void setTintList (tinte ColorStateList)
y
public void setTintMode (PorterDuff.Mode tintMode)
En versiones anteriores de Android, ahora puede usar la biblioteca DrawableCompat
Como dijo @milosmns, debe usar imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Esta API necesita valor de color en lugar de ID de recurso de color. Esa es la causa principal por la que su declaración no funcionó.
Como la primera respuesta no me funcionó:
//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)));
Esto solo parece funcionar en API 21+, pero para mí eso no fue un problema. Puedes usar un ImageViewCompat para resolver ese problema, aunque.
Espero haber ayudado a alguien :-)
Después probé todos los métodos y no funcionaron para mí.
Obtengo la solución utilizando otro PortDuff.MODE.
imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN);
Encontré que podemos usar el selector de color para tint attr:
mImageView.setEnabled(true);
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>
Esto funciono para mi
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
La mayoría de las respuestas se refieren al uso de setColorFilter
que no es lo que se solicitó originalmente.
El usuario @Tad tiene su respuesta en la dirección correcta, pero solo funciona en API 21+.
Para establecer el tinte en todas las versiones de Android, use ImageViewCompat
:
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));
Tenga en cuenta que yourTint
en este caso debe ser un "color int". Si tiene un recurso de color como R.color.blue
, R.color.blue
debe cargar el color int:
ContextCompat.getColor(context, R.color.blue);
No es una respuesta exacta, sino una alternativa más simple:
- Coloca otra vista encima de la imagen.
- Cambie el valor alfa de la vista como desee (programáticamente) para obtener el efecto deseado.
Aquí hay un fragmento de eso:
<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>
No use el modo PowerDuff, use setColorFilter, funciona para todos.
ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));
Prueba esto. Debería funcionar en todas las versiones de Android que admita la biblioteca de soporte:
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;
}
Puedes usar cualquiera de los anteriores para que funcione.
Puede leer más características interesantes de DrawableCompat en los documentos, DrawableCompat .
Puede cambiar el tinte, muy fácilmente en el código a través de:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
// Tinte Blanco
Si quieres tinte de color entonces
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);
Para vector dibujable
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);
ACTUALIZACIÓN : @ADev tiene una solución más nueva en su respuesta here pero parece que se olvidó de mencionar que su solución requiere una biblioteca de soporte más nueva 25.4.0 o superior.
Si su color tiene transparencia hexadecimal, use el siguiente código.
ImageViewCompat.setImageTintMode(img,PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(img,ColorStateList.valueOf(Color.parseColor("#80000000")));
Para borrar el tinte
ImageViewCompat.setImageTintList(img, null);
Simple y una linea
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
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);