ImageView有两种与方法相关的方法:setAlpha和setImageAlpha。前者自API级别1起可用,但自16级以来已弃用。后者自16级起可用。还有另一个setAlpha方法,来自View类,这是在API级别11中引入的
ImageView#setAlpha和ImageView#setImageAlpha之间的区别仅在于命名吗?有任何行为差异吗? View#setAlpha和ImageView#setAlpha之间的关系是什么?
答案 0 :(得分:47)
ImageView.setAlpha(int)
已重命名为ImageView.setImageAlpha(int)
,以避免与API级别11中引入的新方法View.setAlpha(float)
混淆。
View.setAlpha(float)
是所有View
上可用的常规方法,包括ImageView
。它将指定的不透明度应用于整个视图。为实现此目的,默认情况下,系统会像往常一样创建一个临时缓冲区(硬件层),然后在屏幕上绘制具有指定alpha值的缓冲区。这是一个双通机制,需要初始分配一个缓冲区,所以它有点慢。有关更多信息以及如何更改默认行为,请参阅此视频:Hidden Cost of Transparency。
重要的是要注意ImageView
默认情况下包含一个优化,如果它没有背景,它将避免这种缓冲区分配,因此在实践中,如果ImageView.setAlpha(float)
调用ImageView
,则不会有性能损失没有背景。
ImageView.setImageAlpha(int)
(和ImageView.setAlpha(int)
)是适用于ImageView
的方法。它们控制用于直接在屏幕上绘制内容图像(位图或其他)的alpha值,没有中间传递,因此这是用于将透明度应用于ImageView
显示的图像的首选方法。当然,如果你在ImageView
上设置了一个你想要半透明的背景Drawable,这个方法将不会产生预期的结果。
答案 1 :(得分:27)
View.setAlpha(float)
接受一个浮动作为输入,并期望一个0..1范围内的值。ImageView.setAlpha(int)
接受一个int作为输入,并期望一个0..255范围内的值。不推荐使用ImageView.setAlpha(int)
。这可能是因为他们想要删除与基础View.setAlpha(float)
ImageView.setImageAlpha(int)
只是调用已弃用的ImageView.setAlpha(int)
。您应该期望在将来的API更新中删除ImageView.setAlpha(int)
,因此应避免使用它。答案 2 :(得分: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);
}
答案 3 :(得分:1)
我认为只有命名是有区别的。因为setImageAlpha()
比setAlpha()
更具体。对于View#setAlpha
和ImageView#setAlpha/setImageAlpha
,没有直接的关系。View
类有一个setAlpha,因为它可以作为View#ImageView
的父级,所以它的功能就像一个容器。
使用setAlpha
可以设置整个容器的不透明度,它需要该方法。使用setImageAlpha
,您只能设置图像的alpha而不是整个容器。
除此之外,我无法想到他们同时使用alpha方法的原因。