Android ImageButton con un estado seleccionado?

Si estaba usando un ImageButton con un selector para su fondo, ¿hay algún estado que pueda cambiar que cambie su apariencia? Ahora mismo puedo hacer que cambie las imágenes cuando las presiono, pero parece que no hay un estado “resaltado” o “seleccionado” o similar que me permita alternar su apariencia a voluntad.

Aquí está mi XML; solo cambia de apariencia cuando se presiona.

     

Esto funciona para mí:

       

Y luego en java:

 //assign the image in code (or you can do this in your layout xml with the src attribute) imageButton.setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable....)); //set the click listener imageButton.setOnClickListener(new OnClickListener() { public void onClick(View button) { //Set the button's appearance button.setSelected(!button.isSelected()); if (button.isSelected()) { //Handle selected state change } else { //Handle de-select state change } } }); 

Para una transición sin problemas, también puede mencionar el tiempo de animación:

  

ToggleImageButton que implementa la interfaz OnCheckedChangeListener y admite OnCheckedChangeListener y android:checked atributo android:checked xml:

 public class ToggleImageButton extends ImageButton implements Checkable { private OnCheckedChangeListener onCheckedChangeListener; public ToggleImageButton(Context context) { super(context); } public ToggleImageButton(Context context, AttributeSet attrs) { super(context, attrs); setChecked(attrs); } public ToggleImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setChecked(attrs); } private void setChecked(AttributeSet attrs) { TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ToggleImageButton); setChecked(a.getBoolean(R.styleable.ToggleImageButton_android_checked, false)); a.recycle(); } @Override public boolean isChecked() { return isSelected(); } @Override public void setChecked(boolean checked) { setSelected(checked); if (onCheckedChangeListener != null) { onCheckedChangeListener.onCheckedChanged(this, checked); } } @Override public void toggle() { setChecked(!isChecked()); } @Override public boolean performClick() { toggle(); return super.performClick(); } public OnCheckedChangeListener getOnCheckedChangeListener() { return onCheckedChangeListener; } public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) { this.onCheckedChangeListener = onCheckedChangeListener; } public static interface OnCheckedChangeListener { public void onCheckedChanged(ToggleImageButton buttonView, boolean isChecked); } } 

res / values ​​/ attrs.xml:

       

La mejor forma de hacerlo sin más imágenes:

 public static void buttonEffect(View button){ button.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP); v.invalidate(); break; } case MotionEvent.ACTION_UP: { v.getBackground().clearColorFilter(); v.invalidate(); break; } } return false; } }); } 

Prueba esto:

   

También para los colores tuve éxito con

     

Crea un archivo XML en una carpeta res/drawable . Por ejemplo, “btn_image.xml”:

        

Puede combinar los archivos que desee, por ejemplo, cambie “bg_state_1” por “bg_state_deselected” y “bg_state_2” por “bg_state_selected”.

En cualquiera de esos archivos, puede escribir algo como:

     

Cree en un archivo de diseño un ImageView o ImageButton con los siguientes atributos:

  

Más tarde en el código:

 image.setSelected(!image.isSelected());