Могу ли я увеличить количество кнопок на области щелчка программно?

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

Приветствия,

Ответ 1

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

  • Окружать кнопку с помощью слова LinearLayout, который имеет прописку вокруг кнопки.
  • Добавьте тот же onclick в LinearLayout, что и кнопка.
  • В кнопке установите 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>
    

Ответ 2

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

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

Ответ 3

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

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

Здесь кнопка:

<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. Элегантный.

Ответ 4

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

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

Ответ 5

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

Спасибо.

Ответ 6

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

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

Ответ 7

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