¿Cómo resaltar ImageView cuando se enfoca o se hace clic?
⏰ 8 minutos de lectura
Un buen ejemplo de esto es la pantalla de inicio de Twitter (la pantalla con los íconos grandes que se ve cuando la aplicación se inicia por primera vez) o simplemente mire la bandeja de la aplicación cuando enfoca el ícono de una aplicación.
Básicamente, necesito resaltar un ImageView donde el resaltado se contornea a la imagen dentro de ImageView y parece que es un borde de esa imagen. También me gustaría personalizar el resaltado para que tenga un color determinado y se desvanezca.
Gracias,
acicalado
Tienes que asignar el src atributo de la ImageView una lista de estados dibujable. En otras palabras, esa lista de estados tendría una imagen diferente para seleccionado, presionado, no seleccionado, etc. – así es como lo hace la aplicación de Twitter.
Sabía que podía hacer esto, pero me preguntaba si había una forma integrada de manejar esto. Como dije, sé que en el cajón de aplicaciones, los íconos de las aplicaciones hacen esto. Gracias por tu ayuda.
– acicalado
15 de noviembre de 2010 a las 16:40
Bueno, es posible establecer el src en su imagen y luego establecer el atributo de fondo en una lista de selección. Para el estado normal, puede mostrar una transparencia y, luego, para seleccionar, puede mostrar el degradado verde. Creo que debería funcionar, pero nunca lo he probado.
–Josh Clemm
15 de noviembre de 2010 a las 16:44
En realidad, ahora que lo pienso, el cajón de la aplicación usa un diseño de cuadrícula. Entonces, cuando tiene una imagen en una cuadrícula, seleccionarla hará que la celda de la cuadrícula se resalte. El proyecto de muestra de demostraciones de API que viene con el SDK tiene un código de ejemplo para una vista de cuadrícula.
–Josh Clemm
15 de noviembre de 2010 a las 16:48
No olvides agregar android:clickable=”true” en ImageView.
– Canción
27 de octubre de 2015 a las 0:43
clima
Si no tiene otro dibujable para el estado presionado, puede usar setColorFilterpara lograr un efecto de tinte simple.
Se comporta como un selector de estado presionado, por lo que cuando se presiona la imagen, cambia el fondo a un color gris claro.
Maneja el movimiento del dedo fuera de los límites de la vista, por lo tanto, si ocurre, restaura un fondo predeterminado.
es importante volver false de onTouch método cuando quieras apoyar onClickListner también.
hombre, esto es lo que necesito, pero en mi caso está resaltando solo la última imagen en un HorizontaScrollView. ¿Sabes qué podría causar esto? gracias
– FpontoDesenv
19 de julio de 2015 a las 22:08
Sí, es importante devolver false para permitir que se activen los eventos de clic, pero si devuelve false, nunca se llamará a su acción up & move. ¿Qué hacer en esta situación?
– Sébastien BATEZAT
9 febrero 2016 a las 22:15
@Sebastien elimina onClickListener y mueve la lógica de este a onTouchListener. Siempre puede implementar el clic como un evento táctil.
– clima
10 de febrero de 2016 a las 7:09
Sí, seguro que es posible, pero estoy trabajando con una vista de cuadrícula y me gustaría mantener mi onItemClickListener. He intentado llamar a view.performClick en mi oyente táctil pero no tiene efecto. Lástima que no hay mejores opciones. Gracias de cualquier manera
Esta es una extensión de mklimek. No pude hacer que funcionara correctamente a partir de su fragmento. edité un poco
ImageView testImage = (ImageView)findViewById(R.id.imageView);
testImage.setOnTouchListener(listener);
View.OnTouchListener listener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView image = (ImageView) v;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
image.getDrawable().setColorFilter(0x77000000,PorterDuff.Mode.SRC_ATOP);
image.invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: {
//clear the overlay
image.getDrawable().clearColorFilter();
image.invalidate();
break;
}
}
return true;
}
};
Para mostrar imágenes dinámicas, puede usar un LayerDrawable para la fuente de la imagen.
LayerDrawable d = new LayerDrawable(new Drawable[]{new BitmapDrawable(myBmp), getResources().getDrawable(R.drawable.my_selector_list)});
imageView.setImageDrawable(d);
Creo que esto también podría darnos una pista. he añadido OnFocusChangeListener en ImageVIew. Con hasFocusdecir imageVIew.setColorFilter(theColor);
– Yeung
3 de diciembre de 2013 a las 10:48
con mi solución, también obtendrá el resto de los estados y no tendrá que rastrearlo usted mismo, siempre que su lista de estados dibujable esté configurada para los estados que desea. Todo lo que haces es configurar la imagen dibujable y listo.
– Tom Bolwitt
12 de diciembre de 2013 a las 17:44
Sí, tiene usted razón. Y también podemos clonar el dibujable resultante fácilmente con drawable.getConstantState().newDrawable(). Puede evitar que las vistas de imagen usen la misma actualización dibujable de su estado cuando solo quiero un cambio de estado dibujable de ImageView.
– Yeung
18 de diciembre de 2013 a las 3:13
jsidera
Solo para completar la respuesta de Josh Clemm. También puede mantener la misma imagen definida por src, pero cambiar o resaltar solo el fondo. Esto sería más o menos así:
Donde background_normal y background_pressed pueden ser tan complejos como quieras, o tan simples como un @color 🙂
Creo que esto también podría darnos una pista. he añadido OnFocusChangeListener en ImageVIew. Con hasFocusdecir imageVIew.setColorFilter(theColor);
– Yeung
3 de diciembre de 2013 a las 10:48
con mi solución, también obtendrá el resto de los estados y no tendrá que rastrearlo usted mismo, siempre que su lista de estados dibujable esté configurada para los estados que desea. Todo lo que haces es configurar la imagen dibujable y listo.
– Tom Bolwitt
12 de diciembre de 2013 a las 17:44
Sí, tiene usted razón. Y también podemos clonar el dibujable resultante fácilmente con drawable.getConstantState().newDrawable(). Puede evitar que las vistas de imagen usen la misma actualización dibujable de su estado cuando solo quiero un cambio de estado dibujable de ImageView.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información