Android выделяет кнопку изображения при нажатии

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


person Droidme    schedule 16.03.2011    source источник
comment
Можете ли вы показать код, который вы используете для создания кнопки изображения?   -  person Cristian    schedule 16.03.2011


Ответы (5)


На самом деле это не очень сложно сделать. Вам даже не нужно создавать 2 отдельных файла .png или что-то в этом роде. Например, если вы хотите иметь кнопку с градиентом, а затем изменять его при нажатии кнопки:

Шаг 1: Создайте градиент кнопки по умолчанию (drawable/default_button.xml):

<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
    <corners android:radius="3dp" />
    <gradient android:endColor="#8ba0bb" android:startColor="#43708f" android:angle="90" />
    <stroke android:width="1dp" android:color="#33364252" />
</shape>

Шаг 2: Создайте градиент нажатия кнопки по умолчанию (drawable/default_button_pressed.xml):

<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
    <corners android:radius="3dp" />
    <gradient android:endColor="#43708f" android:startColor="#8ba0bb" android:angle="90" />
    <stroke android:width="1dp" android:color="#33364252" />
</shape>

Шаг 3: Создайте селектор (drawable/default_button_selector.xml):

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:drawable="@drawable/default_button_pressed" /> 
    <item android:drawable="@drawable/default_button" /> 
</selector>

Шаг 4 (необязательно). Создайте стиль для кнопки (values/style.xml):

<resources>
    <style name="DefaultButton">
        <item name="android:layout_width">wrap_content</item>   
        <item name="android:layout_height">wrap_content</item>
        <item name="android:background">@drawable/default_button_selector</item>
    </style>
</resources>

Шаг 5: используйте кнопку (layout/main.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" android:layout_height="fill_parent">

    <button style="@style/DefaultButton" />

</RelativeLayout>

Как видите, сделать это не особо сложно.

person Zack Marrapese    schedule 16.03.2011
comment
лол @Зак As you can see, it's not particularly difficult to do. - person Will Tate; 16.03.2011
comment
Это хорошо, так как вы можете легко добавить несколько кнопок, используя один и тот же стиль. - person Matthew Willis; 16.03.2011
comment
что, если нам нужны кнопки с разными фоновыми изображениями? - person Kishore; 21.08.2012

Без необходимости создавать несколько изображений (нажатых, обычных и т. д.) и даже без необходимости создавать селектор. Используйте setOnTouchListener вместо setOnClickListener. Приведенный ниже код даст вам серое наложение на выбранный элемент.

 ((ImageButton)findViewById(R.id.myImageBtn)).setOnTouchListener(new OnTouchListener() {

      @Override
        public boolean onTouch(View v, MotionEvent event) {
          switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN: {
              ImageButton view = (ImageButton ) v;
              view.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
              v.invalidate();
              break;
          }
          case MotionEvent.ACTION_UP:

              // Your action here on button click

          case MotionEvent.ACTION_CANCEL: {
              ImageButton view = (ImageButton) v;
              view.getBackground().clearColorFilter();
              view.invalidate();
              break;
          }
          }
          return true;
        }
    });
person Vinayak Bevinakatti    schedule 13.05.2014
comment
Это сработало для меня. Не забудьте также очистить цветовой фильтр на ACTION_UP. - person Adam Johns; 06.06.2014
comment
Мой ADT не знал, что такое «PorterDuff», поэтому добавляйте суффикс «android.graphics» (android.graphics.PorterDuff.Mode.SRC_ATOP) для подсказки завершения кода. - person 1owk3y; 02.12.2014
comment
Мне очень помогло, Спасибо! - person Idan Magled; 12.06.2015
comment
@AdamJohns, в случае ACTION_UP нет break;, поэтому он очистит его :) - person dragi; 21.02.2017
comment
Это генерирует предупреждение a11y - person Leonardo Rick; 08.05.2021

Чтобы не устанавливать несколько рисунков для каждой кнопки, я установил атрибут цветового фильтра кнопки изображения в прослушивателе касания.

Смотрите код здесь в другом сообщении:

https://stackoverflow.com/a/14278790/891479

person L. G.    schedule 11.01.2013

Мне удалось это сделать!! Сначала вы объявляете buttonStyle.xml в папке с возможностью рисования.

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item
      android:state_focused="true"
      android:state_pressed="true"
      android:drawable="@drawable/button_pressed" />

  <item
      android:state_focused="false"
      android:state_pressed="true"
      android:drawable="@drawable/button_pressed" />

  <item android:drawable="@drawable/button_normal" />
</selector>

Затем вы создаете button_pressed.xml в папке с возможностью рисования.

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
  <solid android:color="@color/semiTransparentGnfrBlueColor" />
  <stroke android:width="10dp" android:color="@android:color/transparent" />
</shape>

После этого вы создаете button_normal.xml в папке drawable.

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:innerRadiusRatio="3"
  android:shape="rectangle">
  <solid android:color="@color/gnfrBlueColor"/>
  <stroke android:width="10dp" android:color="@android:color/transparent" />
</shape>

Вы можете использовать цвета по умолчанию, но если вы хотите сделать это, как я, вам нужно иметь файл с именем colors.xml в папке значений и эти значения внутри:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="gnfrBlueColor" type="color">#2A3748</item>
  <item name="semiTransparentGnfrBlueColor" type="color">#602A3748</item>
<integer-array name="androidcolors">
<item>@color/gnfrBlueColor</item>
    <item>@color/semiTransparentGnfrBlueColor</item>
  </integer-array>
</resources>

Наконец, вы устанавливаете это на свою кнопку или что-то еще:

savedAccountLoginButton.SetBackgroundResource(Resource.Drawable.buttonStyle);

ЗАМЕТЬТЕ, ЧТО я установил обводку с прозрачным цветом, потому что, когда вы устанавливаете backgroundresource, ваша кнопка становится больше, и с этим трюком она остается оригинальной.

Это единственный способ, которым я мог заархивировать это программно.

Если вы хотите сделать это с помощью XML:

<Button
            android:text="ENTRAR"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:background="@drawable/buttonstyle"
            android:textColor="@color/white"
            android:textSize="18sp"
            android:id="@+id/button1" />
person Dayo    schedule 25.10.2017

Вы можете просто использовать android:foreground для своего View, чтобы добиться кликабельного эффекта:

android:foreground="?android:attr/selectableItemBackground"


Для использования с темной темой добавьте также theme в свой layout (чтобы сделать кликабельный эффект понятным):

android:theme="@android:style/ThemeOverlay.Material.Dark"
person Francis    schedule 20.02.2020