Best Practices for Using Alpha

Alpha是图形界面开发中常用的特效,通常我们会使用以下代码来实现Alpha特效:

view.setAlpha(0.5f);
View.ALPHA.set(view, 0.5f);
ObjectAnimator.ofFloat(view, "alpha", 0.5f).start();
view.animate().alpha(0.5f).start();
view.setAnimation(new AlphaAnimation(1.0f, 0.5f));

其效果都等同于:

canvas.saveLayer(l, r, t, b, 127, Canvas.CLIP_TO_LAYER_SAVE_FLAG);

所以常见的alpha特效是通过将图像绘制到offscreen buffer中然后显示出来,这样的操作是非常消耗资源的,甚至可能导致性能问题,在开发过程中我们可以通过其他方式避免创建offsreen buffer。

TextView

对于TextView我们通常需要文字透明效果,而不是View本身透明,所以,直接设置带有alpha值的TextColor是比较高效的方式。

// Not this
textView.setAlpha(alpha);

// 以下方式可以避免创建 offscreen buffer
int newTextColor = (int) (0xFF * alpha) << 24 | baseTextColor & 0xFFFFFF;
textView.setTextColor(newTextColor);

ImageView

同样的对于只具有src image的ImageView,直接调用setImageAlpha()方法更为合理。

// Not this, setAlpha方法由View继承而来,性能不佳
imageView.setAlpha(0.5f);

// 使用以下方式时,ImageView会在绘制图片时单独为图片指定Alpha
// 可以避免创建 offScreenBuffer
imageView.setImageAlpha((int) alpha * 255);

CustomView

类似的,自定义控件时,应该直接去设置paint的alpha。

// Not this
customView.setAlpha(alpha);

// But this
paint.setAlpha((int) alpha * 255);
canvas.draw*(..., paint);

同时Android提供了hasOverlappingRendering()接口,通过重写该接口可以告知系统当前View是否存在内容重叠的情况,帮助系统优化绘制流程,原理是这样的:对于有重叠内容的View,系统简单粗暴的使用 offscreen buffer来协助处理。当告知系统该View无重叠内容时,系统会分别使用合适的alpha值绘制每一层。

/**
 * Returns whether this View has content which overlaps. This function, intended to be
 * overridden by specific View types, is an optimization when alpha is set on a view. If
 * rendering overlaps in a view with alpha < 1, that view is drawn to an offscreen buffer
 * and then composited it into place, which can be expensive. If the view has no overlapping
 * rendering, the view can draw each primitive with the appropriate alpha value directly.
 * An example of overlapping rendering is a TextView with a background image, such as a
 * Button. An example of non-overlapping rendering is a TextView with no background, or
 * an ImageView with only the foreground image. The default implementation returns true;
 * subclasses should override if they have cases which can be optimized.
 *
 * @return true if the content in this view might overlap, false otherwise.
 */
public boolean hasOverlappingRendering() {
    return true;
}

最后引用Chet Haase的一句话作为总结

“You know what your view is doing, so do the right thing for your situation.”

Via Android Tips: Best Practices for Using Alpha

时间: 2024-10-12 11:44:43

Best Practices for Using Alpha的相关文章

团队作业6——展示博客(Alpha版本)

团队成员的简介和个人博客地址,团队的源码仓库地址. 代泽旭:平时做事认真负责,组织能力强,擅长C#.C++等多门语言,,此次学习了PHP语言.微信接口等新技能,负责总体任务分配,开发微信接口. 林至贤:相信坚持了就一定能成功,代码领略能力高,擅长JAVA,C++等,为人谦虚谨慎,做事低调,有着崇高的艺术追求,对编程有着一定的自我理解. 王李焕:编程能力较好,为人诚实友善,不爱张扬,擅长JAVA.C++等语言编程,对网页制作也有一定了解,对编程有着浓厚的兴趣. 童毅南:自己爱动手,动手能力强,编程

alpha版、beta版、rc版

很多软件在正式发布前都会发布一些预览版或者测试版,一般都叫“beta版”或者 “rc版”,特别是开源软件,甚至有“alpha版”,下面来解释一下各个版本的意思. alpha版:内部测试版.α是希腊字母的第一个,表示最早的版本,一般用户不要下载这个版本,这个版本包含很多BUG,功能也不全,主要是给开发人员和 测试人员测试和找BUG用的. beta版:公开测试版.β是希腊字母的第二个,顾名思义,这个版本比alpha版发布得晚一些,主要是给“部落”用户和忠实用户测试用的,该版本任然存 在很多BUG,但

Unity3D ShaderLab 使用alpha参数创建透明效果

Unity3D ShaderLab 使用alpha参数创建透明效果 其实Unity为了方便我们的工作,为我们内置了很多参数.比如马上用到的透明功能. 准备场景新建Shader Material ,一张红绿蓝的贴图. 实现代码及其简单,直接看完成的: Shader "91YGame/AlphaTransparency" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _TransVal

【Unity Shaders】Alpha Test和Alpha Blending

写在前面 关于alpha的问题一直是个比较容易摸不清头脑的事情,尤其是涉及到半透明问题的时候,总是不知道为什么A就遮挡了B,而B明明在A前面.这篇文章就总结一下我现在的认识~ Alpha Test和Alpha Blending是两种处理透明的方法. Alpha Test采用一种很霸道极端的机制,只要一个像素的alpha不满足条件,那么它就会被fragment shader舍弃,"我才不要你类!":否则,就会按正常方式写入到缓存中,并进行正常的深度检验等等,也就是说,Alpha Test

Microsoft.Practices.Unity 通用类

类库的用法网上有很多,就不多说了,下面稍微封装了一下,记个笔记. 结合泛型接口类型和配置文件,得到IUnityContainer实例存于键值对中. 1 namespace Containers 2 { 3 public sealed class ObjectContainer 4 { 5 //fields 6 private static readonly object containerLock = new object(); 7 private static Dictionary<strin

扩增子分析解读6进化树 Alpha Beta多样性

分析前准备 # 进入工作目录 cd example_PE250 上一节回顾:我们的OTU获得了物种注释,并学习OTU表的各种操作————添加信息,格式转换,筛选信息. 接下来我们学习对OTU序列的进化分析.同时计算Alpha和Beta多样性值. 16. 进化树构建 进化树是基于多序列比对的结果,可展示丰富的信息,我们将在R绘图中详细解读.此处只是建树,用于Alpha, Beta多样性分析的输入文件. # clustalo多序列比对,如果没有请安装Clustal Omega clustalo -i

扩增子图表解读1箱线图:Alpha多样性

箱线图 箱形图(Box-plot)又称为盒须图.盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图.因形状如箱子而得名.在宏基因组领域,常用于展示样品组中各样品Alpha多样性的分布 第一种情况,最大或最小值没有超过1.5倍箱体范围 第二种情况,最大或最小值超过1.5倍箱体范围,外位延长线外,即异常值(outliers) Alpha多样性 知识背景:Alpha多样性计算方法 常见的丰度估计方法有Shannon, Chao1和Observed OTU和PD whole tree等.我最喜欢

【第二组】项目冲刺(Alpha版本)第三次每日例会 2017/7/13

项目冲刺(Alpha版本)第三次每日例会 开发小组:Hunter 冲刺经理:林贵渊 小组成员:吴泽斌,林轩宇,张太,李明君,刘仁人 1.每日例会内容 (1)昨天做了什么 1.吴泽斌:解决了错误弹窗Dialog,预留了匹配的接口. 2.林轩宇:调整了登录界面设计,主界面按钮更换. 3.张太:设置界面优化完成. 4.李明君:完成了布局优化,更改头像功能部分完成. 5.刘仁人:实现了二维码的扫描. 6.林贵渊:设置了Flyout和ContentDialog (2)遇到了什么问题 1.吴泽斌:WebPo

关系数据库元组关系演算语言ALPHA

关系演算 :以数理逻辑中的谓词演算为基础 按谓词变元不同分类 1.元组关系演算:以元组变量作为谓词变元的基本对象元组关系演算语言ALPHA2.域关系演算:以域变量作为谓词变元的基本对象域关系演算语言QBE 元组关系演算语言ALPHA (1) 简单检索(即不带条件的检索) 格式: GET 工作空间名 (表达式1) 查询所有被选修的课程号码.GET W (SC.Cno) (2) 限定的检索(即带条件的检索) 格式: GET 工作空间名(表达式1) : 操作条件 查询信息系(IS)中年龄小于20岁的学