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:
- Android: superposición en la ventana sobre las actividades de una tarea
- Superposición transparente GLSurfaceview en la vista existente en android?
- Mostrar una superposición de "ayuda" en un diseño de Android
- Android Map Rendimiento pobre debido a muchas superposiciones?
- Texto que no se muestra en la superposición de MapView
es decir
- Evento touchDown -> Cambiar la superposición de color.
- 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!
- ¿Cómo grabar video con superposición animada en Android?
- Android - vistas de servicio
- Cabeza de chat Haga clic en eventos
- FragmentTransaction.remove no tiene efecto
- Android: Si los marcadores se superponen entre sí en el mapa, el evento de clic se disparará para el último escondido
- Dibujo sobre otras aplicaciones en Android
- Android - LazyAdapter vistas superpuestas
- ¿Posible superponer un botón encima de otro?
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
- ¿Cómo atar a un puerto menos de 1024 en Android?
- ¿Aplicar Touch Swipe en una sola página, la página que se utiliza para cargar datos dinámicamente?