uso sirve que para imagen hacer ejemplo color cambiar boton atributo android android-imageview android-ui

sirve - imagebutton android cambiar imagen



Imagen de Android cambio de tinte para simular clic de botón (5)

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);

Tengo una vista de imagen en la que he establecido un mapa de bits recuperado de una url. En la vista de imagen, configuré un onClickListener que abre un cuadro de diálogo.

Quiero cambiar de algún modo el tinte (oscurecerlo) cuando se presiona la vista de imagen para proporcionar una especie de clic de botón como sensación.

¿Que sugieres?


Para mí, una solución simple está funcionando, el uso de setAlpha (180) en el evento onClick hace que la imagen sea más oscura, dando al usuario un comentario de que se hizo clic o se tocó.

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.


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


Una forma sería usar una combinación de un ColorFilter y una ColorStateList que contenga el color del tinte para cuando se presione el botón. El xml para ColorStateList en el directorio res / color se verí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 el color del tinte (que debe ser parcialmente transparente). Luego, en su subclase ImageView , aplica el color anulando 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 llamará a este código y establecerá automáticamente el matiz según corresponda.


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). El Issue 18220 ha estado presente por un par de años abordando esto, he publicado una solución que resumiré aquí:

Extienda ImageView y ajuste drawableStateChanged () con el código que establece el tinte 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.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>

Utilice el widget y el atributo personalizado con su espacio de nombre 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" android:clickable="true" app:tintColorStateList="@color/color_selector"/> </LinearLayout>

A 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>