setAlpha和setImageAlpha的区别

35

ImageView有两个相关方法: setAlphasetImageAlpha。前者自API level 1起可用,但自level 16起被弃用。后者自level 16起可用。还有另一个setAlpha方法,来自View类,并在API level 11中引入。

ImageView#setAlpha和ImageView#setImageAlpha之间的区别只在于命名吗?它们之间有什么行为差异吗?View#setAlpha与ImageView#setAlpha之间的关系是什么?


答案: ImageView#setAlpha和ImageView#setImageAlpha之间的区别在于它们设置透明度的方式不同。前者使用0到255的整数参数,后者使用0到1的浮点数参数。因此,虽然它们的名称相似,但它们的行为是不同的。View#setAlpha也可以设置透明度,但传递的参数是浮点数,它设置视图及其子项的透明度。ImageView#setAlpha是从View#setAlpha继承而来的方法,因此它们之间存在继承关系。
4个回答

59

ImageView.setAlpha(int)已经更名为ImageView.setImageAlpha(int),以避免与API级别11引入的新方法View.setAlpha(float)产生混淆。

View.setAlpha(float)是适用于所有View(包括ImageView)的通用方法,它将指定的不透明度应用于整个视图。为了实现这一点,默认情况下系统会创建一个临时缓冲区(硬件层),在其中像往常一样绘制视图,然后将缓冲区以指定的alpha值绘制到屏幕上。这是一个双程机制,需要最初分配一个缓冲区,因此它相对较慢。请参见此视频以了解更多信息以及如何更改默认行为:透明度的隐藏成本。 重要的是要注意,ImageView默认包含一种优化,如果它没有背景,则会避免进行此缓冲区分配,因此在实践中,如果ImageView没有背景,则调用ImageView.setAlpha(float)将不会有性能惩罚。

ImageView.setImageAlpha(int)(和ImageView.setAlpha(int))是适用于ImageView的特定方法。它们控制用于直接在屏幕上绘制内容图像(位图或其他)的alpha值,而无需中间传递,因此这是应用于由ImageView显示的图像的透明度的首选方法。当然,如果您在ImageView上设置了背景Drawable,并且还想使其半透明,则此方法将不会产生预期的结果。


1
这是目前为止最全面和准确的答案。不明白为什么它被评为最低。这应该是被接受的答案。 - Gil Moshayof
1
值得注意的是,当资源为自适应图标时,setImageAlpha() 目前效果不佳。在这种情况下,请改用 View.setAlpha()。https://issuetracker.google.com/issues/72694861 - Mark
好的,setBackground()方法并没有产生不良结果。这正是我正在寻找的。谢谢伙计。 - Ashu Kumar

27
  • View.setAlpha(float) 函数接受一个浮点数作为参数,期望的值应在包含0和1之间。
  • ImageView.setAlpha(int) 函数接受一个整数作为参数,期望的值应在包含0和255之间。 ImageView.setAlpha(int) 函数已被弃用。可能是因为它与底层的View.setAlpha(float)函数存在冲突。
  • 正如其他回答者所指出的,ImageView.setImageAlpha(int) 简单地调用了已经被弃用的ImageView.setAlpha(int)函数。您应该预期,在未来的API更新中,ImageView.setAlpha(int)将被移除,因此应避免使用它。

10
这个答案有歧义。ImageView.setAlpha(int)之所以被弃用仅仅是因为它的方法名,现在已经更名为ImageView.setImageAlpha(int)。当你需要在 ImageView 上应用一个 alpha 滤镜时,建议使用setImageAlpha(int)或已弃用的setAlpha(int),因为它们将 alpha 值直接应用于绘制图像的 Canvas 下面的 Paint 中,而 setAlpha(float) 则创建一个临时缓冲区,在缓冲区中绘制视图,然后将缓冲区与指定的 alpha 值混合到屏幕的其余部分中。 - BladeCoder
Chet Haase澄清了@BladeCoder在Google I/O 2013-Android图形性能视频中指出的内容。 - azizbekian

4

是的,这只是一个命名上的区别——在API级别16中,Android源代码中的当前实现为:

/**
 * Sets the alpha value that should be applied to the image.
 *
 * @param alpha the alpha value that should be applied to the image
 *
 * @see #getImageAlpha()
 */
@RemotableViewMethod
public void setImageAlpha(int alpha) {
    setAlpha(alpha);
}

1
这是正确的,但是setAlpha()有一个@Deprecated注释,因此它最可能在未来改变setImageAlpha()的实现。 - Jose_GD
不完全是这样。有一个名为setAlpha(float alpha)的方法,它接受一个float而不是一个int。这是很大的区别。我的意思是,这根本不是同一件事情。 - Louis CAD
抱歉,Louis,您没有注意到在ImageView中,API 16中有一个setAlpha(int alpha)方法,而这个问题就是关于它的。 - cania

1
我认为只是名称不同而已。因为setImageAlpha()setAlpha()更加具体。对于View#setAlphaImageView#setAlpha/setImageAlpha之间没有直接关系... View类有一个setAlpha,因为它可以作为View#ImageView的父容器,所以它像一个容器一样工作。
使用setAlpha可以设置整个容器的不透明度,因此需要该方法。使用setImageAlpha可以仅设置图像的alpha值,而不是整个容器。
除此之外,我真的想不出他们为什么要有两种alpha方法。

1
你指出了setAlpha()setImageAlpha()之间的关键区别。使用setAlpha(),您可以设置整个容器的透明度,因此需要该方法。而使用setImageAlpha(),您只能设置图像的alpha值,而不是整个容器的值。 - CrimsonX
@CrimsonX:查看源代码(例如cania的答案),似乎你所描述的行为差异实际上并不存在。这两种方法做的事情是一样的。因此,这个答案和评论都是不正确的。 - LarsH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接