Android – los estados de la superposición automática táctil / resaltado del estado de la imagen

¿Es posible usar un ImageButton para tener estados de toque y resaltado, sin la necesidad de 2 más recursos de imagen en Android (6 más, considerando h / m / ldpi)? Estoy básicamente buscando un comportamiento similar a iOS donde el sistema operativo puede poner una superposición semi-alfa en el estado de toque de un botón.

He intentado usar setColorFilter(0xFF000000, Mode.MULTIPLY) en el oyente onTouch, y el resultado fue bastante cercano a lo que estaba buscando – pero no estoy seguro de la mejor manera de manejar el estado para lograr esto:

es decir

  1. Evento touchDown -> Cambiar la superposición de color.
  2. TouchUp event -> eliminar la superposición de color y realizar la acción del botón.

¿Hay una mejor manera … o puede alguien ayudar a llenar los vacíos?

No quiero usar imágenes separadas por un par de razones: es un puerto de iPhone para el que todavía no tengo los activos adecuados y requeriría más tiempo de diseño teniendo en cuenta que tengo las creatividades de bajo / medio / alto para considerar.

¡Gracias!

Si está satisfecho con el setColorFilter(0xFF000000, Mode.MULTIPLY) , ¿qué le setColorFilter(0xFF000000, Mode.MULTIPLY) hacer un componente personalizado que amplíe ImageButton?

Algo como:

(Lo siento, no he tenido la oportunidad de probar esto)

 package com.example; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageButton; public class IosImageButton extends ImageButton implements OnTouchListener { public IosImageButton(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); this.init(); } public IosImageButton(final Context context, final AttributeSet attrs) { super(context, attrs); this.init(); } public IosImageButton(final Context context) { super(context); this.init(); } private void init() { super.setOnTouchListener(this); } @Override public boolean onTouch(final View view, final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // touchDown event -> Change color overlay. goes here // eg this.setColorFilter(0xFF000000, Mode.MULTIPLY); return true; case MotionEvent.ACTION_UP: // touchUp event -> remove color overlay, and perform button action. // eg this.setColorFilter(0xFF000000, Mode.MULTIPLY); return true; default: return false; } } } 

Entonces el view.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <com.example.IosImageButton <!-- add standard ImageButton setting here --> /> </RelativeLayout> 

No utilice eventos táctiles para intentar mostrar los estados apropiados en algo como esto. Inevitablemente lo conseguirás parcialmente mal. El marco de trabajo hace un montón de trabajo para detectar la intención del usuario (por ejemplo: el usuario tocó hacia abajo, pero luego se deslizó fuera de su dedo) teniendo en cuenta las cosas como slop, etc

Para ImageButton, puede utilizar el atributo src para mostrar el icono y, a continuación, utilizar un StateListDrawable adecuado como fondo.

He creado un proyecto rápido para que lo veas en Github

Tenga en cuenta que los estados táctiles se muestran en el fondo, no en el primer plano. Vea la discusión en Google+ sobre por qué los ingenieros de framework de Android piensan que la retroalimentación por contacto debería estar detrás, no en el frente. Si todavía quieres que el dibujable esté delante, mira mi post en mi blog

  • Android: configuración del relleno en un fondo de imagen de superposición
  • El desplazamiento y el zoom de MapView es lento después de agregar muchas superposiciones
  • ListView superpone otro diseño al desplazarse
  • Android: Si los marcadores se superponen entre sí en el mapa, el evento de clic se disparará para el último escondido
  • Dibujo de una línea / ruta en Google Maps
  • ¿Cómo grabar video con superposición animada en Android?
  • Imagen sobre otra imagen Android
  • Cabeza de chat Haga clic en eventos
  • Barra de acción de superposición oscurecida por la barra de estado
  • Convertir la ubicación en GeoPoint
  • Superposición de teclas de teclado de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.