ImageButton отображает странное поведение при перезаписи цвета фона

При настройке ImageButton я заметил, что у него был какой-то серый цвет фона, который не сочетался с остальным интерфейсом.

введите описание изображения здесь

Это был код для ImageButton

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:src="@drawable/ic_material"/>

Но когда я попытался перезаписать фон на прозрачный, вот так:

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:src="@drawable/ic_material"
    android:background="@android:color/transparent"/>

Кнопка полностью потеряла свою форму и набивку

введите описание изображения здесь

Кто-нибудь знает, почему это происходит?

3 ответа

Решение

Причина, по которой у imageButton есть фон, заключается в том, что это кнопка с изображением, а не с текстом. Итак, согласно документации Android:

Открытый класс ImageButton ImageButton расширяет ImageView

Отображает кнопку с изображением (вместо текста), которая может быть нажата или нажата пользователем. По умолчанию кнопка ImageButton выглядит как обычная кнопка со стандартным фоном кнопки, который меняет цвет при разных состояниях кнопки. Изображение на поверхности кнопки определяется либо атрибутом android:src в элементе XML, либо методом setImageResource (int). Чтобы удалить стандартное фоновое изображение кнопки, определите свое собственное фоновое изображение или установите цвет фона прозрачным. Чтобы указать различные состояния кнопок (сфокусировано, выбрано и т. Д.), Вы можете определить разные изображения для каждого состояния. Например, синее изображение по умолчанию, оранжевое для фокусировки и желтое для нажатия. Самый простой способ сделать это - использовать "селектор" с возможностью рисования в формате 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/button_pressed" /> <!-- pressed -->
>      <item android:state_focused="true"
>            android:drawable="@drawable/button_focused" /> <!-- focused -->
>      <item android:drawable="@drawable/button_normal" /> <!-- default -->  </selector> 

Сохраните файл XML в вашем проекте res/drawable/ folder и затем укажите его как drawable для источника вашего

ImageButton (в атрибуте android:src). Android автоматически изменит изображение в зависимости от состояния кнопки и соответствующих изображений, определенных в XML. Порядок элементов важен, потому что они оцениваются по порядку. Вот почему "нормальное" изображение кнопки появляется последним, потому что оно будет применено только после того, как android:state_pressed и android:state_focused оба оценили false. Смотрите руководство по кнопкам.

Для получения дополнительной информации ознакомьтесь с документацией: Кнопка Image

Это происходит потому, что вы устанавливаете цвет в качестве фона, а цвет не имеет размера / размера.

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

Только src поддерживает тип масштаба в ImageView или другом классе, который расширяет ImageView

Использование android:background="#000000" или же

imageButton.setBackgroundDrawable(null);
Другие вопросы по тегам