Android выделяет кнопку изображения при нажатии - PullRequest
16 голосов
/ 16 марта 2011

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

Ответы [ 4 ]

30 голосов
/ 16 марта 2011

Это на самом деле не очень сложно сделать.Вам даже не нужно создавать 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>

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

19 голосов
/ 13 мая 2014

Без необходимости создавать несколько изображений (нажатые, нормальные и т. Д.) И даже не создавать селектор. Используйте 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;
        }
    });
2 голосов
/ 25 октября 2017

Мне удалось это сделать !!Сначала вы объявляете 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 в папке для рисования.

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

NOTICE THAT Я установил обводку с прозрачным цветом , потому что когда вы устанавливаете 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" />
2 голосов
/ 11 января 2013

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

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

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

...