2011-04-03 8 views
11

¿Es posible usar ImageButton para tener estados de toque y resaltado, sin la necesidad de 2 recursos de imagen más en Android (6 más, considerando h/m/ldpi)? Básicamente, estoy buscando un comportamiento similar al iOS, donde el sistema operativo puede colocar una superposición semi-alfa en el estado de un botón que se puede tocar hacia abajo.Android - superposición automática touchdown/highlight imagebutton states

He intentado usar setColorFilter(0xFF000000, Mode.MULTIPLY) en el oyente onTouch, y el resultado fue bastante cerca de lo que fue después - 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. evento touchUp -> eliminar la superposición de color y realizar la acción del botón.

¿Hay una manera mejor ... O alguien puede 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 recursos adecuados y que requeriría más tiempo de diseñador teniendo en cuenta que tengo el bajo/medio/Creatividades elevadas a tener en cuenta

Gracias!

Respuesta

1

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

Algo así como:

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

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 
       // e.g. this.setColorFilter(0xFF000000, Mode.MULTIPLY); 
       return true; 

      case MotionEvent.ACTION_UP: 
       // touchUp event -> remove color overlay, and perform button action. 
       // e.g. 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> 
1

No utilice eventos de toque para tratar para mostrar los estados apropiados en algo como esto. Inevitablemente lo obtendrás parcialmente mal. El marco hace mucho trabajo para detectar la intención del usuario (por ejemplo: el usuario tocó tierra pero luego se deslizó fuera de su dedo) teniendo en cuenta cosas como slop, etc.

Para ImageButton, puede usar el atributo src para mostrar el ícono y luego use un StateListDrawable apropiado como fondo.

he creado un proyecto rápido para que usted vea on Github

Tenga en cuenta que los estados táctiles se muestran en el fondo, no es el primer plano. Consulte la discusión on Google+ sobre por qué los ingenieros del framework Android piensan que los comentarios táctiles deberían estar detrás, no al frente. Si aún desea que el dibujante esté al frente, vea mi publicación on my blog

Cuestiones relacionadas