【问题标题】:Difference between setAlpha and setImageAlphasetAlpha 和 setImageAlpha 的区别
【发布时间】:2014-02-17 14:35:07
【问题描述】:

ImageView 有两个方法相关的方法:setAlphasetImageAlpha。前者从 API 级别 1 开始可用,但从级别 16 开始不推荐使用。后者从级别 16 开始可用。还有另一个 setAlpha 方法,来自 View 类,这是在 API 级别 11 中引入的。

ImageView#setAlpha 和 ImageView#setImageAlpha 的区别仅仅在于命名吗?有什么行为差异吗? View#setAlpha 和 ImageView#setAlpha 是什么关系?

【问题讨论】:

    标签: android android-imageview android-view


    【解决方案1】:

    ImageView.setAlpha(int) 已重命名为 ImageView.setImageAlpha(int) 以避免与 API 级别 11 中引入的新方法 View.setAlpha(float) 混淆。

    View.setAlpha(float) 是一种通用方法,适用于所有Views,包括ImageView。它将指定的不透明度应用于整个视图。为了实现这一点,默认情况下,系统会创建一个临时缓冲区(硬件层),在其中照常绘制视图,然后使用指定的 alpha 值在屏幕上绘制缓冲区。这是一种两遍机制,需要初始分配缓冲区,因此速度较慢。有关更多信息以及如何更改默认行为,请参阅此视频:Hidden Cost of Transparency。 需要注意的是,ImageView 默认包含一个优化,如果它没有背景,它将避免此缓冲区分配,因此在实践中,如果 ImageView 没有背景,调用 ImageView.setAlpha(float) 时不会有性能损失。

    ImageView.setImageAlpha(int)(和ImageView.setAlpha(int))是ImageView特有的方法。它们控制用于直接在屏幕上绘制内容图像(位图或其他)的 alpha 值,没有中间通道,因此这是将透明度应用于ImageView 显示的图像的首选方法。当然,如果你在ImageView 上设置了一个背景 Drawable 并且你也希望是半透明的,那么这种方法不会产生预期的结果。

    【讨论】:

    • 这是迄今为止最全面、最准确的答案。不明白为什么它的评分最低。这应该是公认的答案。
    • 值得注意的是,当前setImageAlpha()在资源为自适应图标时效果不佳。在这种情况下,请改用 View.setAlpha()。 issuetracker.google.com/issues/72694861
    • 好的点setBackground不会产生不好的结果。这就是我正在寻找的。谢谢朋友
    【解决方案2】:
    • View.setAlpha(float) 接受浮点数作为输入,并期望值在 0..1 范围内。
    • ImageView.setAlpha(int) 接受一个 int 作为输入,并期望一个在 0..255 范围内的值(包括 0..255)。 ImageView.setAlpha(int) 已弃用。这可能是因为他们想消除与底层View.setAlpha(float) 的冲突
    • 正如其他响应者指出的那样,ImageView.setImageAlpha(int) 只需调用已弃用的ImageView.setAlpha(int)。您应该预料到 ImageView.setAlpha(int) 将在未来的 API 更新中被删除,因此应该避免使用它。

    【讨论】:

    • 这个答案模棱两可。 ImageView.setAlpha(int) 仅因其名称而被弃用,它已重命名为 ImageView.setImageAlpha(int)。当您需要在 ImageView 上应用 alpha 过滤器时,最好使用 setImageAlpha(int) 或已弃用的 setAlpha(int),因为它们将 alpha 值直接应用于在 Canvas 上绘制图像的底层 Paint,而 setAlpha(float ) 创建一个临时缓冲区,在其中绘制您的视图,然后将缓冲区与屏幕的其余部分以指定的 alpha 值混合。
    • Chet Haase 澄清了@BladeCoder 在Google I/O 2013 - Android Graphics Performance video 中指出的内容
    【解决方案3】:

    是的,这只是命名上的区别 - 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);
    }
    

    【讨论】:

    • 这是真的,但是 setAlpha() 有一个 @Deprecated 注释,所以很可能 setImageAlpha() 的实现将来会改变
    • 并非如此。 setAlpha(float alpha) 需要 float,而不是 int。很大的区别。我的意思是,根本不是一回事。
    • 抱歉,Louis,您没有看到在 ImageView 中,API 16 中有一个 setAlpha(int alpha),这个问题是关于这个的。
    【解决方案4】:

    我相信只有命名是不同的。因为setImageAlpha()setAlpha() 更具体。对于View#setAlphaImageView#setAlpha/setImageAlpha,没有直接关系。View 类有一个 setAlpha,因为它可以作为View#ImageView 的父级,所以它的功能就像一个容器。

    使用setAlpha,您可以设置整个容器的不透明度,因此它需要该方法。使用setImageAlpha,您可以只设置图像而不是整个容器的 alpha。

    除此之外,我真的想不出他们同时拥有 alpha 方法的原因。

    【讨论】:

    • 您找到了setAlpha()setImageAlpha() 之间的关键区别使用 setAlpha 您可以设置整个容器的不透明度,因此它需要该方法。使用 setImageAlpha 你可以只设置图像而不是整个容器的 alpha。
    • @CrimsonX:查看源代码(例如在 cania 的答案中),您描述的行为差异似乎实际上并不存在。这两种方法做同样的事情。所以看来这个答案和评论是不正确的。
    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    相关资源
    最近更新 更多