Как иметь прозрачную кнопку 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.

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


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"

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"

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

Это самый лучший и самый эффективный ответ. :)
Хуан Мендес

112

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

style="?android:attr/borderlessButtonStyle"

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

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

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


у меня не сработало, а второе заставило приложение вылетать. Возможно, я что-то сделал неправильно, но я не знаю что.
Яннис Дран

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"

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" />


0

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

 ImageButton btn=(ImageButton)findViewById(R.id.ImageButton01);
 btn.setBackgroundColor(Color.TRANSPARENT);

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работал.


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

Это приведет к другому слою, добавив к overdraw.
tir38
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.