La respuesta de happydude es la forma más elegante de manejar esto, pero desafortunadamente (como se señala en los comentarios), el código fuente de ImageView solo acepta un número entero (color sólido). Issue 18220 ha sido de alrededor de un par de años frente a esto, he publicado una solución que no voy a resumir aquí:
Extender ImageView y envolver drawableStateChanged() con código que establece el matiz basado en el nuevo estado:
TintableImageView.java
package com.example.widgets;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.support.v7.widget.AppCompatImageView;
import com.example.R;
public class TintableImageView extends AppCompatImageView {
private ColorStateList tint;
public TintableImageView(Context context) {
super(context);
}
public TintableImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public TintableImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TintableImageView, defStyle, 0);
tint = a.getColorStateList(R.styleable.TintableImageView_tintColorStateList);
a.recycle();
}
@Override
protected void drawableStateChanged() {
super.drawableStateChanged();
if (tint != null && tint.isStateful())
updateTintColor();
}
private void updateTintColor() {
int color = tint.getColorForState(getDrawableState(), 0);
setColorFilter(color);
}
}
definir un atributo personalizado:
attrs.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<declare-styleable name="TintableImageView">
<attr name="tintColorStateList" format="reference|color" />
</declare-styleable>
</resources>
utilizar el widget y el atributo personalizado con su espacio de nombres local en lugar de Android de:
example_layout.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<com.example.widgets.TintableImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/example"
android:clickable="true"
app:tintColorStateList="@color/color_selector"/>
</LinearLayout>
continuación, puede utilizar un selector de color como happydude sugirió:
color_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/pressed_color"/>
<item android:color="#00000000"/>
</selector>
I probé tu sugerencia No parece hacer nada. Utilizando el depurador noté que el método drawableStateChanged() no se activa en onPress, sino que parece activarse solo en onClick. – Abhishek
Hmm, no puedo ver ningún error en el código anterior. Por definición, el método debe invocarse cuando el estado presionado cambia. He estado usando esta construcción en mi propio código y funciona bien. Como prueba, en su XML de ImageView agregue 'android: tint =" @ color/pressed_color "'. Esto debería agregar un tinte permanente a su imagen, ya que llama al mismo método de configuración del filtro de color que el código anterior. De esta forma, al menos puedes descartar un problema con el color que elijas. – happydude
Lo siento, soy tonto. Puede simplemente agregar su lista de estado de color directamente a su archivo XML 'ImageView' directamente. Ver editar arriba. – happydude