Ésta es una muy tarde "yo también", pero después de llegar a ésta y otras preguntas en busca de una solución, me encontré con un sencillo y elegante solución propia.
Otro question se quejó de que no se podía hacer clic en el fondo transparente de su imagen. Si eso es un problema, esto parece solucionar eso también.
Aquí está el botón:
<ImageButton
android:id="@+id/arrowUp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/arrow_up"
android:background="@drawable/clear_button_background" />
Las líneas relevantes son los dos últimos. "@drawable/arrow_up"
es un par de estados de botón en archivos * .png definidos en un archivo .xml dibujable * como esto:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
android:drawable="@drawable/tri_up_blue" /> <!-- pressed -->
<item android:state_selected="true"
android:drawable="@drawable/tri_up_blue" /> <!-- selected -->
<item android:state_focused="true"
android:drawable="@drawable/tri_up_blue" /> <!-- focused -->
<item android:drawable="@drawable/tri_up_green" /> <!-- default -->
</selector>
Sólo el botón básico. Nada especial. Y "@drawable/clear_button_background"
es sólo esto:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/transparent"/>
<size android:width="20dp" android:height="30dp" />
</shape>
la altura y anchura que aquí son el área seleccionable, cambiar el tamaño según sea necesario. Puedes reutilizarlo para tantos botones como necesites en una sola vista, a diferencia del TouchDelegate absurdamente detallado. Sin oyentes adicionales. No agrega ningún punto de vista o grupo a su jerarquía y no estará jugando con relleno y márgenes todo el día.
Simple. Elegante.
Esto solo funciona sortof. Para que funcione por completo, debe hacer que el botón setClickable (false), de lo contrario, al hacer clic en el botón en sí no se resaltará, ya que obtiene su estado del elemento primario que no se hace clic en este punto. Una vez que hace que el botón no se pueda hacer clic, no es necesario establecer un detector onClick en él. –