87 votes

Comment augmenter la zone de frappe du bouton Android sans mettre à l'échelle l'arrière-plan ?

J'ai un bouton avec un dessin personnalisé.

 <Button
    android:layout_width="22dip"
    android:layout_height="23dip"
    android:background="@drawable/triangle" />

Le dessin est un triangle avec un fond transparent.

 |\
| \
|__\

Je trouve ce bouton difficile à appuyer. Premièrement, il est relativement petit. Deuxièmement, les pixels transparents ne sont pas exploitables. Je voudrais garder le dessin de la même taille, mais faire de la zone touchée une forme carrée deux fois la taille du triangle.

 _____________
|            |
|    |\      |
|    | \     |
|    |__\    |
|____________|

72voto

Morris Lin Points 721

vous pouvez utiliser l'API TouchDelegate.

 final View parent = (View) button.getParent();  // button: the view you want to enlarge hit area
parent.post( new Runnable() {
    public void run() { 
        final Rect rect = new Rect(); 
        button.getHitRect(rect); 
        rect.top -= 100;    // increase top hit area
        rect.left -= 100;   // increase left hit area
        rect.bottom += 100; // increase bottom hit area           
        rect.right += 100;  // increase right hit area
        parent.setTouchDelegate( new TouchDelegate( rect , button)); 
    } 
}); 

49voto

kwahn Points 198

Vous voulez du "padding" Cela mettra l'espace à l'intérieur de la vue. La marge placera l'espace à l'extérieur, ce qui n'augmentera pas la zone touchée.

  <Button
    android:layout_width="22dip"
    android:layout_height="23dip"
    android:background="@drawable/triangle"
    android:padding="10dp" />

25voto

LuxuryMode Points 11381

Vous devez utiliser un TouchDelegate , qui est défini dans la documentation de l'API comme « Classe d'aide pour gérer les situations où vous souhaitez qu'une vue ait une zone tactile plus grande que ses limites de vue réelles »

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

12voto

William Reed Points 762

Sur la base de la réponse, j'ai créé une fonction d'extension kotlin pour l'aider.

 /**
 * Increase the click area of this view
 */
fun View.increaseHitArea(dp: Float) {
    // increase the hit area
    val increasedArea = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, Resources.getSystem().displayMetrics).toInt()
    val parent = parent as View
    parent.post {
        val rect = Rect()
        getHitRect(rect)
        rect.top -= increasedArea
        rect.left -= increasedArea
        rect.bottom += increasedArea
        rect.right += increasedArea
        parent.touchDelegate = TouchDelegate(rect, this)
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X