android — Как увеличить область нажатия кнопки Android без масштабирования фона?" />

Как увеличить область нажатия кнопки Android без масштабирования фона?

У меня есть кнопка с настраиваемым рисунком.

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

Рисуемое это треугольник с прозрачным фоном.

|\
| \
|__\

Мне сложно нажать на эту кнопку. Во-первых, он относительно маленький. Во-вторых, прозрачные пиксели не могут быть изменены. Мне бы хотелось, чтобы размер рисования был одинаковым, но чтобы область попадания имела квадратную форму, вдвое превышающую размер треугольника.

_____________
|            |
|    |\      |
|    | \     |
|    |__\    |
|____________|
64 голоса | спросил JoJo 18 52011vEurope/Moscow11bEurope/MoscowFri, 18 Nov 2011 03:58:01 +0400 2011, 03:58:01

16 ответов


0

вы можете использовать TouchDelegate API.

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)); 
    } 
}); 
ответил Morris Lin 26 J0000006Europe/Moscow 2014, 11:39:38
0

Вы хотите "padding". Это поместит пространство в представление. Margin поместит пространство снаружи, что не увеличит область попадания.

 <Button
    android:layout_width="22dip"
    android:layout_height="23dip"
    android:background="@drawable/triangle"
    android:padding="10dp" />
ответил kwahn 2 PMpTue, 02 Apr 2013 23:24:45 +040024Tuesday 2013, 23:24:45
0

Вам необходимо использовать TouchDelegate, который определен в документации API как «вспомогательный класс» для обработки ситуаций, когда требуется представление иметь большую область касания, чем ее фактические границы просмотра "

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

ответил LuxuryMode 18 52011vEurope/Moscow11bEurope/MoscowFri, 18 Nov 2011 08:27:06 +0400 2011, 08:27:06
0

Я предпочитаю это решение:

Просто добавьте положительный отступ и отрицательную разметку в файле ресурсов макета:

<some.View
  ..
  android:padding="12dp"
  android:margin="-12dp"
  .. />

Это очень небольшое изменение по сравнению с использованием TouchDelegates. Я также не хочу запускать Runnable для добавления интерактивной области внутри моего Java-кода.

Одна вещь, которую вы могли бы рассмотреть, если представление должно быть идеальным для пикселей: padding не всегда может быть равно margin padding всегда должен быть там, как указано. margin зависит от окружающих видов и будет смещено значениями margin других видов.

ответил Timo Bähr 1 MarpmTue, 01 Mar 2016 14:42:18 +03002016-03-01T14:42:18+03:0002 2016, 14:42:18
0

просто добавив отступ к кнопке

 <Button
android:layout_width="wrap_contant"
android:layout_height="wrap_contant"
android:background="@drawable/triangle"
android:padding="20dp" />

Таким образом, ваша кнопка ... примет высоту и ширину изображения треугольника и добавит к кнопке отступ 20 дп, не растягивая само изображение. и если вам нужна минимальная ширина или минимальная высота, вы можете использовать minWidth и minHeight теги

ответил Nitesh 11 J000000Monday16 2016, 13:15:09
0

Я не знаю точно, что вы подразумеваете под "без увеличения фона для рисования". Если вы имеете в виду, что вы просто не хотите, чтобы растягиваемый объект растягивался, тогда у вас есть один вариант - взять фоновый png и добавить к нему дополнительную прозрачную границу пикселя. Это увеличит вашу зону попадания, но не растянет ваше изображение.

Если, тем не менее, вы имеете в виду, что вообще не хотите изменять это рисование, то я думаю, что ваш единственный вариант - использовать большие жестко заданные значения высоты и ширины.

ответил FoamyGuy 18 52011vEurope/Moscow11bEurope/MoscowFri, 18 Nov 2011 05:10:36 +0400 2011, 05:10:36
0

попробуйте с этим

  <Button
        android:id="@+id/btn_profile"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:background="@android:color/transparent"
        android:drawableBottom="@drawable/moreoptionicon"
        android:onClick="click"
        android:paddingBottom="15dp"
        android:visibility="visible" />
ответил shailesh 5 J0000006Europe/Moscow 2014, 17:26:11
0

См. Можно ли программно увеличить область нажатия кнопок? . Это выглядит как самый простой способ для меня наверняка. Даже включает в себя немного анимации только реального активируемого объекта, позволяя фону получать клики. Скоро я буду применять это к своему собственному коду.

ответил Thomson Comer 18 52011vEurope/Moscow11bEurope/MoscowFri, 18 Nov 2011 05:15:13 +0400 2011, 05:15:13
0

Это сработало для меня:

public void getHitRect(Rect outRect) {
    outRect.set(getLeft(), getTop(), getRight(), getBottom() + 30);
}

Хотя на самом деле вы должны конвертировать 30 в наклон или сделать процент от высоты кнопки.

ответил mxcl 26 MarpmMon, 26 Mar 2012 17:16:58 +04002012-03-26T17:16:58+04:0005 2012, 17:16:58
0

Мне просто нужно то же самое: кликабельная область больше, чем изображение кнопки. Я обернул его в FrameLayout размером больше фонового, и изменил внутренний тег Button на TextView. Чем я направлял обработчик кликов для работы с этим FrameLayout, а не с внутренним TextView. Все работает хорошо!

ответил Dmitri Novikov 13 J000000Friday12 2012, 15:47:34
0

Вы можете использовать прозрачную кнопку следующим образом ...

<Button
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@android:color/transparent" /> 

вы можете увеличивать или уменьшать размер кнопки по своему усмотрению и использовать enter code here ImageView вверх по кнопке ....

<ImageView
    android:layout_width="22dip"
    android:layout_height="23dip"
    android:background="@drawable/triangle" />
ответил Yatendra Sen 22 J000000Friday16 2016, 15:34:37
0

Для этих целей я использовал ImageButton. В xml defenition вы увидите эти два атрибута:

  • android: background - можно использовать в качестве фона.
  • android: scr - устанавливает рисование в качестве содержимого этого ImageView.

Итак, у нас есть два объекта рисования: фоновый и исходный. В вашем примере источник будет triagle (drawable /trianlge):

|\
| \
|__\

А фон квадратный (прорисовываемый /квадратный):

_____________
|            |
|            |
|            |
|            |
|____________|

Вот пример ImageButton xml:

<ImageButton
   ...
   android:src="@drawable/triangle"
   android:background="@drawable/square">

Результат:

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

Также может быть нарисован в квадрате, может иметь несколько различных состояний (нажатие, фокусировка). И вы можете расширить фоновый размер, используя отступы.

На всякий случай вот пример для рисования фона с панели действий Android Compat:

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_disabled_holo_dark" />
    <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/abc_list_selector_disabled_holo_dark" />
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_dark" />
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_dark" />
    <item android:state_focused="true" android:drawable="@drawable/abc_list_focused_holo" />
    <item android:drawable="@android:color/transparent" />
 </selector>
ответил molokoka 5 ThuEurope/Moscow2013-12-05T16:41:42+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 16:41:42 +0400 2013, 16:41:42
0

Вы можете установить отступ для вида, то есть вашей кнопки.

<Button
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:background="@android:color/transparent"
        android:padding="15dp" />

Надеюсь, это работает для вас.

ответил Mayank Bhatnagar 1 MarpmTue, 01 Mar 2016 14:45:04 +03002016-03-01T14:45:04+03:0002 2016, 14:45:04
0

Чтобы получить правильный ответ, добавьте отступы в область, доступную для касания, увеличьте И измените изображение с фона на srcCompact .

<Button
    android:layout_width="22dip"
    android:layout_height="23dip"
    android:padding="6dp"
    app:srcCompat="@drawable/triangle"/>

Чтобы использовать app: scrCompat, вам нужно добавить xmlns:app="http://schemas.android.com/apk/res-auto" к своему основному /родительскому элементу в xml.

пример завершен:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/height_btn_bottom_touch_area"
android:background="@color/bg_white"
android:clipToPadding="false"
android:elevation="7dp">

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stateListAnimator="@animator/selected_raise"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" >

    <ImageView
        android:id="@+id/bottom_button_bg"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:contentDescription=
            "@string/service_request_background_contentDescription"
        android:elevation="1dp"
        android:padding="6dp"
        app:srcCompat="@drawable/btn_round_blue"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" >
    </ImageView>

    <TextView
        android:id="@+id/bottom_button_text"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:elevation="1dp"
        android:gravity="center"
        android:text="@string/str_continue_save"
        android:textColor="@color/text_white"
        android:textSize="@dimen/size_text_title"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
ответил Canato 14 AMpSat, 14 Apr 2018 07:25:10 +030025Saturday 2018, 07:25:10
0

Простое добавление отступов заставляло мой флажок не центрироваться. Следующее сработало для меня, однако я указал фиксированный размер для флажка (согласно моей спецификации пользовательского интерфейса). Идея заключалась в том, чтобы добавить отступы слева, а не справа. Я добавил отступы сверху и снизу, чтобы увеличить размер сенсорной цели и сохранить флажок по центру.

<CheckBox
        android:id="@+id/checkbox"
        android:layout_width="30dp"
        android:layout_height="45dp"
        android:paddingLeft="15dp"
        android:paddingTop="15dp"
        android:paddingBottom="15dp"
        android:button="@drawable/checkbox"
        android:checked="false"
        android:gravity="center"
       />
ответил RPM 4 +03002018-10-04T20:32:12+03:00312018bEurope/MoscowThu, 04 Oct 2018 20:32:12 +0300 2018, 20:32:12
0
<Button
    android:layout_width="32dp"
    android:layout_height="36dp"
    android:layout_margin="5dp"
    android:background="@drawable/foo" 
/>

Размер фона все еще 22x26dp. Просто добавьте поля.

ответил Terence Lui 18 52011vEurope/Moscow11bEurope/MoscowFri, 18 Nov 2011 06:02:19 +0400 2011, 06:02:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132