Tono de cambio de imagen de Android para simular el botón de clic

Tengo una vista de la imagen en la que he establecido un mapa de bits extraído de una url. En la vista de la imagen he configurado un onClickListener que abre un diálogo.

Quiero cambiar de alguna manera el tinte (lo hace más oscuro) cuando la vista de la imagen se presiona sobre para proporcionar una clase de tecleo del botón como sensación.

¿Que sugieres?

La respuesta de happydude es la manera más elegante de manejar esto pero desafortunadamente (como se señaló en los comentarios) el código fuente de ImageView sólo acepta un entero (color sólido). La edición 18220 ha estado alrededor por un par de años que dirige esto, he fijado una solución allí que resumiré aquí:

Extender imagenVer y envolver drawableStateChanged () con un código que establece el matiz en función del 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.widget.ImageView; import com.example.R; public class TintableImageView extends ImageView { 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_tint); a.recycle(); } @Override protected void drawableStateChanged() { super.drawableStateChanged(); if (tint != null && tint.isStateful()) updateTintColor(); } public void setColorFilter(ColorStateList tint) { this.tint = tint; super.setColorFilter(tint.getColorForState(getDrawableState(), 0)); } private void updateTintColor() { int color = tint.getColorForState(getDrawableState(), 0); setColorFilter(color); } } 

Defina un atributo personalizado:

Attrs.xml

 <?xml version="1.0" encoding="UTF-8"?> <resources> <declare-styleable name="TintableImageView"> <attr name="tint" format="reference|color" /> </declare-styleable> </resources> 

Utilice el widget y el atributo personalizado con su espacio de nombres local en lugar de Android:

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" app:tint="@color/color_selector"/> </LinearLayout> 

A continuación, puede utilizar un selector de color como happydude sugerido:

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> 

Una forma sería utilizar una combinación de un ColorFilter y un ColorStateList que contenga el color de tinte para cuando se presiona el botón. El xml para el ColorStateList en el directorio res / color sería así:

Button_pressed.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> 

Donde @color/pressed_color es su color de tinte (que debe ser parcialmente transparente). A continuación, en la subclase ImageView , se aplica el color sustituyendo drawableStateChanged() .

 @Override protected void drawableStateChanged() { super.drawableStateChanged(); ColorStateList list = getResources().getColorStateList(R.color.button_pressed); int color = list.getColorForState(getDrawableState(), Color.TRANSPARENT); setColorFilter(color); invalidate(); } 

Cada vez que cambie el estado del botón, se llama a este código y automáticamente se establece el tinte según corresponda.

Tendría que probarlo, pero debería ser capaz de establecer un xml con ese comportamiento como el ImageView dibujable, y luego establecer su mapa de bits como el fondo de ImageView.

Para mí una solución simple es trabajar, usando setAlpha (180) en onClick evento hacer la imagen más oscura, dando al usuario una retroalimentación que se hizo clic o tocado.

 final ImageView myImage = (ImageView) findViewById(R.id.ivDocument); myImage.setImage...(... your image ...); // load your ImageView myImage.setClickable(true); myImage.setFocusable(true); myImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { myImage.setAlpha(180); doWhateverYouWantHere(v); } }); 

En cuanto a su diseño XML, nada especial.

Este fragmento de código funcionó para mí:

 porterDuffColorFilter = newPorterDuffColorFilter(getResources().getColor(R.color.cardview_dark_background),PorterDuff.Mode.MULTIPLY); imgView.getDrawable().setColorFilter(porterDuffColorFilter); imgView.setBackgroundColor(Color.TRANSPARENT); 
  • ¿Cómo puedo crear un widget de interfaz de usuario de diseño de material de Android?
  • Obtener la posición de la imagen actual en la Galería
  • Cómo probar la aplicación empresarial android en varios dispositivos
  • Cómo crear un cuadro de diálogo modal en android
  • Android getMeasuredHeight devuelve valores erróneos!
  • ¿Cómo mostrar iconos en el menú de desbordamiento de ActionBar?
  • En el adaptador gridview, getView (position == 0) fue invocado demasiadas veces para medir el diseño cuando setImageBitmap () en un cargador
  • Android: calcula el tamaño de la vista dentro de MyAdapter :: getView
  • RunOnUiThread vs Looper.getMainLooper (). Publicar en Android
  • Android - notifyDataSetChanged () y subprocesos
  • Android menú desplegable (sin girador!)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.