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

  • Emular el botón Atrás con superposición en Android
  • Dibujar texto en la parte superior de mapa de bits no
  • No se puede agregar la ventana android.view.ViewRoot$W@44da9bc0 - permiso denegado para este tipo de ventana
  • Cómo guardar la superposición con vista previa de la cámara en android?
  • Cómo agregar vista de superposición sobre otra vista en android?
  • Agrega una superposición transparente mayor para aumentar el área de clic, sin cambiar el diseño.
  • Superposición sobre un ImageView en Android
  • Google maps api no coloca el marcador en la ubicación correcta
  • Android: configuración del relleno en un fondo de imagen de superposición
  • SetFocus (overlayItem) de ItemizedOverlay no funciona
  • Diferentes marcadores con nombre en Google Android Map
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.