Можно ли программно увеличить область нажатия кнопки? - PullRequest
28 голосов
/ 01 июня 2010

Иногда в моем пользовательском интерфейсе есть кнопка, которая настолько мала, что ее трудно нажать. До сих пор я решил добавить прозрачную рамку вокруг кнопки в фотошопе. Простое увеличение отступов на кнопке не работает, так как это также растянет изображение. Так как каждый раз, когда я хочу изменить поверхность, на которую можно кликать, стоит открывать фотошоп, и есть какой-то способ сделать это программно? Я попытался разместить рамку позади кнопки и сделать ее кликабельной, но тогда кнопка не изменит внешний вид при прикосновении, как следует. Конечно, я мог бы также добавить к рамке раскладки сенсорный прослушиватель, который изменяет внешний вид кнопок, но тогда это довольно код, если у меня есть несколько таких кнопок.

Приветствия

Ответы [ 7 ]

34 голосов
/ 21 января 2011

Я лично, я бы использовал TouchDelegate. Это позволяет вам иметь дело с сенсорной целью, и визуальный вид ограничивает две разные вещи. Очень удобно ...

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

28 голосов
/ 10 февраля 2011

Я только что нашел изящный способ решить эту проблему.

  1. Окружите кнопку, скажем, LinearLayout с отступом вокруг кнопки.
  2. Добавьте тот же клик к LinearLayout, что и для кнопки.
  3. В Button установите для duplicateParentState значение true, чтобы кнопка выделялась при нажатии вне кнопки, но внутри 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>
    
12 голосов
/ 13 января 2013

Это слишком поздно "я тоже", но после того, как я пришел к этому и другим вопросам в поисках решения, я нашел простое, элегантное решение самостоятельно.

Другой вопрос жаловался, что на прозрачном фоне их изображения нельзя было нажать. Если это проблема, то, похоже, это тоже обойдется.

Вот кнопка:

<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" />

Соответствующие строки - последние две. "@drawable/arrow_up" - это несколько состояний кнопок в * .png файлах, определенных в отрисовываемом * .xml файле, например:

<?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>

Просто ваша основная кнопка. Ничего особенного. И "@drawable/clear_button_background" это просто:

<?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>

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

Simple. Элегантный.

3 голосов
/ 01 июня 2010

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

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

1 голос
/ 14 сентября 2011

Другая идея состоит в том, чтобы создать новое прозрачное изображение и наложить на него значок, чтобы область касания была больше и дизайн выглядел идеально. Проверьте изображение

Спасибо.

0 голосов
/ 03 октября 2012

Просто добавьте отступ к макету вместо поля

    <ImageView
    android:id="@+id/back_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="25dip"
    android:src="@drawable/back_btn" />
0 голосов
/ 01 июня 2010

Может быть, вы могли бы сделать это, посмотрев координаты X и Y MotionEvent , переданного в onTouchEvent ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...