Как иметь прозрачную кнопку ImageButton: Android

493
<ImageButton android:id="@+id/previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/media_skip_backward"
android:background="@drawable/transparent"></ImageButton>

Это то, что я пытался получить прозрачную кнопку ImageButton, чтобы поместить эти кнопки в SurfaceView. Но Eclipse выдает мне ошибку в проекте, как только я включаю прозрачную строку в xml.

Пожалуйста помоги.

Namratha
источник
3
просто примечание: вместо вашего собственного прозрачного изображения вы можете просто использовать @android: color / transparent - вам не нужно ваше собственное прозрачное изображение
Матиас Конрадт
6
Обратите внимание, что, предоставляя кнопке изображения прозрачный фон, вы удаляете визуальную обратную связь для состояния нажатия кнопки (и, вероятно, отключения). Это приводит к небольшому снижению удобства использования.
szeryf
Чтобы быть уверенным, что ImageButton фактически размещается на SurfaceView, также полезно вызвать previousButton.bringToFront (), в противном случае он все еще может быть скрыт за SurfaceView
Джей Снейдер,
Android API предоставляет правильный атрибут для создания прозрачного фона без потери визуальной обратной связи для нажатия кнопки или для других состояний! Прочитайте мой ответ ниже!
lory105

Ответы:

984

Попробуйте использовать ноль для фона ...

android:background="@null"
Квинтин Робинсон
источник
Спасибо. Это работает. Видно только изображение, а не рамка вокруг него. Но могу ли я наложить эту кнопку на SurfacaView, то есть на предпросмотр видео? Это возможно? Как это сделать?
Намрата
1
@Namratha SurfaceViewДолжно позволять вам размещать кнопки над поверхностью, но обратите внимание: «Это можно использовать для размещения наложений, таких как кнопки, на поверхности, хотя учтите, однако, что это может повлиять на производительность, поскольку полное альфа-смешивание композит будет выполняться каждый раз, когда поверхность меняется. " от developer.android.com/reference/android/view/SurfaceView.html
Квинтин Робинсон,
57
Неправильно использовать нулевой фон !! Android API предоставляет правильный атрибут для создания прозрачного фона без потери визуальной обратной связи для нажатия кнопки или для других состояний! Прочитайте мой ответ ниже!
lory105
1
Установка фона кнопки в нуль не является хорошей идеей, как упомянуто выше и ниже. Ответы с использованием соответствующих атрибутов намного лучше, или создать правильный селектор с прозрачным для не нажатых и соответствующей обратной связи при нажатии.
Дамиан Вальчак
Это дало мне ошибку .. Но это сработало для меня Android: background = "@ Android: цвет / прозрачный"
Хуан Мендес
303

НЕ ИСПОЛЬЗУЙТЕ ПРОСТРАНСТВЕННЫЙ ИЛИ НУЛЕВОЙ ПЛАН, потому что тогда кнопка (или общий вид) больше не будет выделяться при нажатии кнопки !!!

У меня была та же проблема, и, наконец, я нашел правильный атрибут из Android API, чтобы решить эту проблему. Это может относиться к любому виду.

Используйте это в спецификации кнопок:

android:background="?android:selectableItemBackground"
lory105
источник
4
Для этого требуется API 11 - вы убираете 24% телефонов в дикой природе (по состоянию на январь 2014 года)
Шон Нил
8
Похоже, что при использовании библиотеки поддержки требование API> = 11 может быть преодолено stackoverflow.com/questions/19714682/…
Someone Somewhere
15
Для получения эффекта круговой ряби используйтеandroid:background="?android:selectableItemBackgroundBorderless"
Mateus Gondim
7
К счастью, по состоянию на 2019 год это исключает примерно 0% телефонов в дикой природе.
user1032613
140

Вы также можете использовать прозрачный цвет:

android:background="@android:color/transparent"
Geykel
источник
9
@Geykel, @Adam, вы должны знать, что этот атрибут весьма опасен при безоговорочном использовании, поскольку он добавит еще один прозрачный слой, который будет отображаться на экране и может привести к перерасходу пикселей и замедлению работы вашего приложения. Чтобы проверить это, вы можете использовать Developer option: Show GPU overdrawи увидеть разницу между установкой фона @nullи @android:color/transparent.
Амирлазарович
Это самый лучший и самый эффективный ответ. :)
Хуан Мендес
112

Установка фона на "@null"заставит кнопку не иметь никакого эффекта при нажатии. Это будет лучшим выбором.

style="?android:attr/borderlessButtonStyle"

Позже я обнаружил, что с помощью

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

тоже хорошее решение. И вы можете наследовать этот атрибут в своем собственном стиле.

jiasli
источник
у меня не сработало, а второе заставило приложение вылетать. Возможно, я что-то сделал неправильно, но я не знаю что.
Яннис Дран
5
Требуется API уровня 11. Источник
Джейсон Робинсон,
2
Это правильный ответ. Также используя AppCompact, с этим ответом волновой эффект работает отлично, а на api 19 нормальный нажатый эффект работает из коробки. android: background = "? android: attr / selectableItemBackground" Отлично!
Раффау,
Это решение selectableItemBackgroundимеет дополнительное преимущество, заключающееся в изменении состояния кнопки при нажатии. Другие решения делают эту кнопку неактивной.
Игорь Ганапольский
14

во время выполнения вы можете использовать следующий код

btn.setBackgroundDrawable(null);
Адем
источник
8
btn.setBackgroundColor (Color.TRANSPARENT); Работает на всех уровнях API
AlBeebe
setBackgroundDrawable не рекомендуется использовать setbackGroundColor, как предложено выше AlBeebe
bhaskarc
этот метод устарел
Рэй Кидди
11

Я считаю, что принятый ответ должен быть: android:background="?attr/selectableItemBackground"

Это то же самое, что и ответ @ lory105, но он использует библиотеку поддержки для максимальной совместимости ( android:эквивалент доступен только для API> = 11)

Сэм Стерн
источник
8

Удалить эту строку:

android:background="@drawable/transparent">

И в вашем классе активности набор

ImageButton btn = (ImageButton)findViewById(R.id.previous);
btn.setAlpha(100);

Вы можете установить альфа-уровень от 0 до 255

o означает прозрачный, а 255 означает непрозрачный.

Нишант Шах
источник
Но позволяет ли эта кнопка лежать поверх SurfaceView?
Намрата
5
Этот ответ неверен и вводит в заблуждение, так как делает всю кнопку полупрозрачной. Если вы хотите сделать это из кода, тогда передайте null методу setBackground. setAlpha это не то, что вам нужно.
Квинтин Виллисон
Это делает весь вид прозрачным.
Радж
5

Лучший способ - использовать прозрачный цветовой код

android:background="#00000000"

используйте цветовой код # 00000000, чтобы сделать любую вещь прозрачной

Аджай Венугопал
источник
4
@android:color/transparentбез жестко закодированных значений.
Фред
1
Нет, ссылочные значения должны быть предпочтительнее ... но IMO, @Fred, даже размещение @android:ссылки непосредственно в макете считается жестко закодированным значением, поскольку, если вы хотите изменить его, вам все равно придется поискать его в макете. Я бы объявил что-то вроде этого <item name="something">@android:color/transparent</item>и использовал бы мое собственное значение в макете, чтобы я мог легко найти его в своем файле resources.xml и изменить его без необходимости искать его в макете
Клифф Бертон,
2

Используйте ImageView... по умолчанию прозрачный фон ...

Даниэль Гомес Рико
источник
3
Но это не кнопка
Мезио
2
Вы можете использовать ImageView в качестве кнопки. В вашем Java-коде вы просто говорите ImageView previous = (ImageView) findViewById (R.id.previous); а затем previous.setOnClickListener (new OnClickListener {public void onClick (/ * это происходит при касании ImageView * /)}); Вуаля!
Мариенке
2

Я уже что-то добавлял в фон, так что эта вещь работала для меня:

   android:backgroundTint="@android:color/transparent"

(Android Studio 3.4.1)

РЕДАКТИРОВАТЬ : работает только на Android API уровня 21 и выше. для совместимости используйте это вместо

   android:background="@android:color/transparent"
Arsam
источник
1

Использовать этот:

<ImageButton
 android:id="@+id/back"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="@null"
 android:padding="10dp"
 android:src="@drawable/backbtn" />
Акшай Паливал
источник
1

Установите фон ImageButton как @null в XML

<ImageButton android:id="@+id/previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/media_skip_backward"
android:background="@null"></ImageButton>
Муртуза Хан
источник
1

Используйте "@null" . Это сработало для меня.

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/bkash"
    android:id="@+id/bid1"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:background="@null" />
abir99
источник
1

Это android:background="@android:color/transparent"

<ImageButton
    android:id="@+id/imageButton"
    android:src="@android:drawable/ic_menu_delete"
    android:background="@android:color/transparent"
/>
Николай Подольный
источник
0

Это программно установлен цвет фона как прозрачный

 ImageButton btn=(ImageButton)findViewById(R.id.ImageButton01);
 btn.setBackgroundColor(Color.TRANSPARENT);
Zar E Ahmer
источник
0

Программно это может быть сделано:

image_button.setAlpha(0f) // to make it full transparent
image_button.setAlpha(0.5f) // to make it half transparent
image_button.setAlpha(0.6f) // to make it (40%) transparent
image_button.setAlpha(1f) // to make it opaque
Мухаммед Рефаат
источник
Я не downvoter, но это, кажется, делает все изображение прозрачным, а не только фон.
Тревор
@ Тридцать, я знаю, и это точно ОП спрашивает в своем вопросе «прозрачная кнопка ImageButton».
Мухаммед Рефаат
1
Вы абсолютно правы, ОП попросил прозрачную кнопку. Но его пример говорит о том, что он мог запросить кнопку с прозрачным фоном (например android:background="@drawable/transparent"). В любом случае, я просто предлагаю возможную причину понижения голосов; Я не говорю, что это оправдано.
Тревор
1
@ threed хорошо, может быть, это было причиной, спасибо, в любом случае.
Мухаммед Рефаат
0

В вашем Backgroundатрибуте XML установите любой цветовой White(#FFFFFF)оттенок или Black(#000000)shade.if, если вы хотите прозрачности, просто поставьте 80 перед фактическим хеш-кодом.

#80000000   
Алиреза Ганбариния
источник
-2
<ImageButton
    android:id="@+id/previous"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/media_skip_backward">
</ImageButton>

Я использовал прозрачный pngдля того ImageButton, и тот ImageButtonработал.

Kiyoshi
источник
Это не хорошее решение .. используйте правильный атрибут, предоставляемый Android API! Прочитайте мой ответ.
lory105
Это приведет к другому слою, добавив к overdraw.
tir38