2010-06-01 20 views
28

A veces tengo un botón en mi UI que es tan pequeño que es difícil hacer clic. Mi solución hasta ahora ha sido agregar un borde transparente alrededor del botón en photoshop. Simplemente aumentar el relleno en el botón no funciona, ya que esto también estirará la imagen. Dado que es un poco complicado abrir el photoshop cada vez que quiero cambiar la superficie en la que se puede hacer clic, ¿hay alguna forma de hacerlo por medio de un programa? He intentado colocar un framelayout detrás del botón y hacer que se pueda hacer clic, pero luego el botón no cambiará la apariencia al tacto como debería. Por supuesto, también podría agregar un ontouchlistener en el framelayout que cambia la apariencia de los botones, pero luego bastante código si tengo varios de esos botones.¿Puedo aumentar botones en el área de clic programáticamente?

Saludos,

Respuesta

29

que acabo de encontrar una clara forma de resolver este problema.

  1. Rodee el botón con un diseño de LinearLayout que tenga el relleno alrededor del botón.
  2. Agregue el mismo clic a LinearLayout como el Botón.
  3. En el botón configure el duplicateParentState en verdadero, lo que hace que el botón se resalte al hacer clic fuera del botón pero dentro de LinearLayout.

    <LinearLayout 
        android:layout_height="fill_parent" 
        android:onClick="searchButtonClicked" 
        android:layout_centerVertical="true" 
        android:orientation="horizontal" 
        android:layout_width="wrap_content" 
        android:paddingRight="10dp" 
        android:paddingLeft="30dp"> 
        <Button 
         android:id="@+id/search_button" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:background="@drawable/toggle_button_selector" 
         android:textColor="#fff" 
         android:text="Search" 
         android:focusable="true" 
         android:textStyle="bold" 
         android:onClick="searchButtonClicked" 
         android:layout_gravity="center_vertical" 
         android:duplicateParentState="true"/> 
    </LinearLayout> 
    
+5

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. –

2

Creo que su solución es la mejor disponible en este momento, si no quiere profundizar en algunas cosas de Android e interceptar todos los eventos motionEvent y TouchEvents usted mismo y luego también tendría que activar la vista presionada de el botón usted mismo, etc.

Simplemente cree un nine patch image con un borde transparente estirable. De esta forma, puede cambiar el tamaño de la imagen sin necesidad de cambiar la imagen y su botón aumentará o disminuirá sin que cambie el fondo real que se muestra.

33

Yo personalmente, usaría un TouchDelegate. Esto le permite lidiar con el objetivo táctil y los límites de la vista visual como dos cosas diferentes. Muy práctico ...

http://developer.android.com/reference/android/view/TouchDelegate.html

+0

Gracias GeorgeLawrence, has hecho una publicación en stackoverflow ¡y es la que estoy buscando! –

+0

Esta es generalmente la mejor solución para el problema de área táctil. –

+3

Una explicación sobre 'TouchDelegate' y un código de fragmento: http://developer.android.com/training/gestures/viewgroup.html#delegate –

1

de Anothe idea es hacer que la nueva imagen transparente y poner icono sobre la misma por lo que el área de contacto será más y diseño de la mirada perfecta. Check out the image

Gracias.

0

Simplemente proporcione el acolchado a la disposición en el lugar de Margen

<ImageView 
    android:id="@+id/back_btn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="25dip" 
    android:src="@drawable/back_btn" /> 
+1

Esto ampliará el fondo de la vista, lo que podría no ser deseable. – pgsandstrom

+0

sí, eso es correcto, pero puede ser útil cuando no hay mucho en el diseño y pocos botones. – sidhanshu

+0

El relleno no es suficiente si no desea estirar la imagen, debe usar 'android: scaleType =" centerInside "' junto con el relleno para obtener el efecto deseado. – ForceMagic

12

É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.

+3

¡Eso es realmente genial, gracias! – pgsandstrom

+0

Es una buena idea si puede usar ImageButton, aunque muchos botones están basados ​​en texto, lo que hace que esto sea más difícil de aplicar. – greg7gkb

+0

@ greg7gkb para un botón basado en texto, simplemente agrega 'relleno '. (Agregar el relleno a un botón basado en imágenes estiraría la imagen, por lo que las personas buscan alguna solución que no sea el relleno). – ToolmakerSteve

Cuestiones relacionadas