如何使用透明的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上的目的。但是,一旦在xml中包含透明行,Eclipse就会给我一个错误。

请帮忙。


3
只是一个侧面说明:除了您自己的透明图像,您通常也可以只使用@android:color / transparent-不需要自己的自定义透明图像
Mathias Conradt 2010年

6
请注意,通过为图像按钮提供透明背景,您将删除按钮单击(可能已禁用)状态的视觉反馈。这导致可用性略有下降。
szeryf

为了确保将ImageButton实际放置在SurfaceView上,调用previousButton.bringToFront()也是有用的,否则它可能仍隐藏在SurfaceView的后面
Jay Snayder 2013年

Android API提供了正确的属性来创建透明背景,而不会丢失单击按钮或其他状态的视觉反馈!在下面阅读我的答案!
lory105

Answers:


984

尝试使用null作为背景...

android:background="@null"

谢谢。这可行。仅看到图像,而不看到周围的框。但是我可以在SurfacaView上方(即在视频预览上方)放置此按钮吗?这可能吗?我该怎么做?
Namratha,2010年

1
@Namratha The SurfaceView应该允许您将按钮放在表面上,但请注意:“此按钮可用于将诸如按钮之类的覆盖层放置在Surface的顶部,但是请注意,由于完全alpha混合会影响性能每次表面更改时都将执行合成。” 来自developer.android.com/reference/android/view/SurfaceView.html
Quintin Robinson,2010年

57
使用空背景是不正确的!Android API提供了正确的属性来创建透明背景,而不会丢失单击按钮或其他状态的视觉反馈!在下面阅读我的答案!
lory105

1
如上文和下文所述,将按钮背景设置为null并不是一个好主意。使用适当属性的答案要好得多,或者为未单击的对象创建透明的正确选择器,并在单击时提供适当的反馈。
Damian Walczak 2014年

那给了我一个错误..但这对我有用android:background =“ @ android:color / transparent”
Juan Mendez

303

不要使用透明或空布局,因为这样按钮(或通用视图)在单击时将不再突出显示!!!

我遇到了同样的问题,最后我从Android API找到了正确的属性来解决该问题。它可以应用于任何视图。

在按钮规格中使用它:

android:background="?android:selectableItemBackground"

4
这需要API 11-您需要淘汰24%的野外电话(截至2014
Shaun Neal

8
看来,使用支持库,该API> = 11的要求可能会被克服stackoverflow.com/questions/19714682/...
有人的地方

15
对于一轮连锁反应,使用android:background="?android:selectableItemBackgroundBorderless"
马特乌斯Gondim

7
幸运的是,截至2019年,这消除了大约0%的野外电话。
user1032613 19-10-18

140

您还可以使用透明颜色:

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

9
@ Geykel,@ Adam,您应该意识到,无条件使用此属性非常危险,因为它将添加另一个透明层,该透明​​层将被绘制到屏幕上,并可能导致像素过度绘制并减慢您的应用程序的速度。为了测试它,你可以使用Developer option: Show GPU overdraw和看到一个背景设置之间的差异@null@android:color/transparent
amirlazarovich

这是最好,最有效的答案。:)
胡安·门德斯

112

将背景设置为"@null"会使单击按钮无效。这将是一个更好的选择。

style="?android:attr/borderlessButtonStyle"

后来我发现使用

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

也是一个很好的解决方案。您可以按照自己的样式继承此属性。


没有为我工作,第二个使应用程序崩溃。也许我做错了,但我不知道是什么。
Yannis Dran

5
需要API级别11。来源
Jason Robinson

2
这是正确的答案。同样使用AppCompact,通过此答案,涟漪效果可以完美发挥作用,在api 19上,正常按下的效果可以直接使用。android:background =“?android:attr / selectableItemBackground”很棒!
拉斐尔

这种解决方案的selectableItemBackground另一个好处是,在单击时可以更改按钮的状态。其他解决方案使按钮看起来不可点击。
IgorGanapolsky

14

在运行时,您可以使用以下代码

btn.setBackgroundDrawable(null);

8
btn.setBackgroundColor(Color.TRANSPARENT); 适用于所有API级别
AlBeebe 2013年

setBackgroundDrawable已被AlBeebe建议使用setbackGroundColor弃用
bhaskarc

此方法现已弃用
Ray Kiddy

11

我相信公认的答案应该是: android:background="?attr/selectableItemBackground"

这与@ lory105的答案相同,但是它使用支持库以实现最大的兼容性(android:等效项仅适用于API> = 11)


8

删除此行:

android:background="@drawable/transparent">

然后在您的活动班级中

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

您可以将Alpha级别设置为0至255

o表示透明,而255表示不透明。


但这是否使按钮位于SurfaceView的顶部?
Namratha,2010年

5
这个答案是错误的并且具有误导性,因为它会使整个按钮变得半透明。如果希望通过代码执行此操作,则将null传递给setBackground方法。setAlpha并不是您所需要的。
Quintin Willison

它使整个视图透明。
拉吉(Raj)

5

最好的方法是使用透明的颜色代码

android:background="#00000000"

使用颜色代码#00000000使任何事物透明


4
@android:color/transparent没有硬编码的值。
Fred

1
不,引用值应该是首选...但是IMO,@ Fred,甚至将@android:引用直接放在布局中也被认为是硬编码值,因为如果要更改它,您仍然必须在布局中浏览才能找到它。我会声明这样的内容<item name="something">@android:color/transparent</item>并在布局中使用我自己的值,以便可以在我的resources.xml文件中轻松找到它并进行更改,而不必在布局中进行搜索
Cliff Burton

2

使用ImageView...默认情况下具有透明背景...


3
但这不是一个按钮
Moesio

2
您可以将ImageView用作按钮。在您的Java代码中,您只说ImageView previous =(ImageView)findViewById(R.id.previous); 然后是previous.setOnClickListener(new OnClickListener {public void onClick(/ *这在您触摸ImageView * /)时发生)});瞧!
marienke 2013年

2

我已经在后台添加了一些东西,所以对我有用:

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

(Android Studio 3.4.1)

编辑:仅适用于21级以上的android api。为了兼容性,请改用它

   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

在XML中将ImageButton的背景设置为@null

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

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

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

我不是拒绝投票的人,但这似乎使整个图像透明,而不仅仅是背景透明。
特雷弗

我知道@threed,而这恰恰是OP在他的问题中问的“透明ImageButton”。
穆罕默德·里法(Muhammed Refaat)

1
您绝对正确,OP要求提供透明按钮。但他的示例表明他可能打算要求使用透明背景的按钮(例如android:background="@drawable/transparent")。无论哪种方式,我都只是在暗示降低投票的可能原因。我并不是说这是有道理的。
特雷弗

1
@threed很好,可能就是它的原因,谢谢您。
穆罕默德·利法特

0

在XML的set Background属性中,可以设置任何颜色White(#FFFFFF)阴影或Black(#000000)阴影。如果要透明度,请在实际哈希码之前加上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>

pngImageButton和使用了透明的东西ImageButton


这不是一个好的解决方案。使用Android API提供的正确属性!阅读我的回答。
lory105

这将导致另一层,添加到透支。
tir38
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.