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.
- Direcciones de la transición de explosión entre fragmentos
- SetMinDate (...) para DatePicker no funciona cuando se invoca una segunda vez
- ¿Cómo hacer que el menú de aplicaciones de Facebook sea nuevo en Android?
- Eliminar la sombra de barra de notificación en la aplicación de Android
- ViewPager con FragmentPagerAdapter no muestra contenido
¿Que sugieres?
- Android- ¿Cómo diferenciar los diseños de Galaxy S-3 y Galaxy S-4?
- Botón de esquina redonda: ¿Dónde estoy equivocado
- NullPointerException en android.widget.AbsListView.contentFits (AbsListView.java:722)
- Android: Cómo crear pestañas como las que aparecen en la página de la interfaz de usuario de Android
- LinearLayout no rellena la vista de desplazamiento
- ¿Cómo evitar que un fragmento se agregue varias veces?
- SetShadowLayer provoca lento tiempo de dibujo en GridView?
- Patrón de interfaz de usuario de las acciones rápidas de Android
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);
- NPE en Facebook SDK 4.10: Intenta invocar el método de interfaz 'java.lang.Object com.facebook.inject.Lazy.get ()' en una referencia de objeto nulo
- AuthToken de AccountManager en cliente Android ya no funciona