原文链接 : Support Libraries v22.1.0
22 Apr 2015
好久不见了啊大家~ 你可能听说了我们已经发布 22.1.0 support libraries 的这个消息, 这可能是目前为止我们对 support library 改动最大的一次更新。
在我们开讲前,建议先读一下 Ian Lake 的这篇官方 blog,里面列出了 这次更新中所有的新特性。
这篇文章我将重点讲解内部运行的方式和原因,尤其是我完成的部分 (因为我非常清楚了解这些)。
先从 AppCompat 说起吧,我们在这个版本中对它做了很大的更新。首先,它的重构...
在之前的版本中进入 AppCompat 唯一的入口 ActionBarActivity 已经被我们抛弃了。 也就是说你以后只能使用一组 Activity 视图层,再也不能像 PreferenceActivity 那样使用它了。
我们现在提取出了所有内部内容,并将它们暴露给一个单一委托 API , AppCompatDelegate 。AppCompatDelegate 可以从 任何提供了 Window.Callback 接口的 Android 对象中构造, 例如 Activity 或 Dialog 的子类。你可以使用它的静态方法 [create](https://developer.android.com/reference/android/support/v7/app/AppCompatDelegate.html#create(android.app.Activity, android.support.v7.app.AppCompatCallback)) 创建它。
如果你创建了一个委托,你需要在每次调用它提供的接口时回调到它。
(例如 onCreate()
),不过这很简单,可以提取到一个基类中。
最终,你可以给所有 Activity 的子类附加任何你想要的 AppCompat 的功能。
如果你打算使用 AppCompatDelegate ,我强烈建议你有空看一眼 AppCompatActivity 的源码。这是一个(极端的)例子介绍了怎样整合 AppCompatDelegate。
大部分人不需要这层自定义,可以像原来那样使用 ActionBarActivity 那样使用 AppCompatActivity 这个类就好。
上面刚刚提到了 Dialog ,你应该也想到了我们还加入了什么。在完成重构工作后, Dialog 很自然就是我们下一步工作对象。实际上从 decor-setup 角度来看, Activity 和 Dialog 这里有一些小的不同。
这意味着我们终于解决了自 v21 以来 AppCompat 最大的需求: material styled dialogs (balalalala~)。
我们现在有了新的 AppCompatDialog 类,
你应该在在引用(or 关联) Theme.AppCompat.Dialog
时使用它。
最后,AppCompat 现在也有了它自己的 AlertDialog 实现,来方便构建 material 样式的 AlertDialog。只要使用 android.support.v7.app.AlertDialog 就好了,它会自己处理细节部分。
有一点要注意,AppCompat 的 AlertDialog 没有实现框架版本所做的一切。 它只暴露了在这个 ‘material 世界’ 中有价值的部分。( (╯°□°)╯︵ ┻━┻ )
在进入这部分前,请先阅读这篇文章 Theme vs Style, 了解下将要讲解内容的基础。
在 AppCompat v21 里,我们提供了一个快速方便的方法设置设置 Toolbar
的主题,使用 app:theme
。
在 v22.1.0 里,我们扩充了它的功能,现在你可以给你的 layout 里的任意视图
设置主题了。只要使用 android:theme
这个属性就好了,可以在
compat 和 framework 之间无缝地切换功能。
最好的一点要数它会自动继承父视图的 theme ,并且兼容所有 API v11 以上的设备。 一个例子:
<Toolbar
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<!-- This TextView inherits its theme from the parent Toolbar -->
<TextView android:text="I'm light!" />
</Toolbar>
对于运行 API v10 甚至更老的设备来说,你也可以使用 android:theme
属性,
不过它不会继承父视图 theme 。这就意味着你要么重新考虑你的布局,要么
为每一个子视图都设置上 android:theme
属性。(这样做效率真的很低)
如果你感兴趣的话,开启继承父类 theme 的方法在这里 LayoutInflater.Factory2 。
如果读过了 Ian 的文章,你可能看到了和 控件着色 (tinting widgets)相关的内容 (这里还有一些新的内容)。
很好,不过关于这点还有一个变化:我们不会再修改 该平台主题的默认 widget 样式了。也就是说如果你使用这个 widget 的 AppCompat 实现(无论显式还是隐式的),那么你在 v21 版本之前的设备上只能获取到 material 样式。在实践中你应该不会看到有什么不同, 因为我们会自动插入适当的 AppCompat 的实现。
这样我们就解决了已经使用 material 样式但是没有着色的问题。它出现在 widget 的平台实现使用了我们的样式,并且出现在不同的位置之中时,比如 Preferences 。
反之,你将会看到当前平台默认的样式 (Holo,etc)。 虽然这样看起来可能有点奇怪,不过这可比看一个空白未着色的 drawable 好多了。
现在 AppCompat 预测 窗口主题 flag 时会更严格 ,配合框架更密切。
背后的原因是为我们早些时候提到的 dialogs 提供支持。它们大量使用了
AppCompat 之前并没有重视的 windowNoTitle
标志。
升级到 v22.1.0 以后,你可能已经遇到过下面的异常:
IllegalArgumentException: AppCompat does not support the current theme features
我在这里回答了解决办法: http://stackoverflow.com/q/29790070/474997
support libraries 的老祖宗 support-v4 还在继续增长,添加了一些新内容。
ColorUtils 已经从 Palette 中移入到 support-v4里。 它包含了一些非常好的操作颜色的方法。比如,你可以计算在某个背景中, 最小的文本颜色 alpha 值:
int backgroundColor = ...;
int textColor = Color.WHITE;
float minContrastRatio = 4.5f; // We want a minimum contrast ration of 1:4.5
int minAlpha = ColorUtils.calculateMinimumAlpha(
textColor, backgroundColor, minContrastRatio);
if (minAlpha != -1) {
// There is an alpha value which has enough contrast, use it!
return ColorUtils.setAlphaComponent(textColor, minAlpha);
}
还有很多方便的方法,比如颜色合成,计算亮度工具等等。更多信息可以 去看文档。
Lollipop 中加入的 Drawable 着色的方法非常好用,可以让你动态的处理着色资源。 在 v21 support library 中 AppCompat 有它自己的实现,现在我们将它移入到 support-v4 的 DrawableCompat 之中让大家都可以使用它。 知道它的工作方式很重要。
Drawable drawable = ...;
// Wrap the drawable so that future tinting calls work
// on pre-v21 devices. Always use the returned drawable.
drawable = DrawableCompat.wrap(drawable);
// We can now set a tint
DrawableCompat.setTint(drawable, Color.RED);
// ...or a tint list
DrawableCompat.setTintList(drawable, myColorStateList);
// ...and a different tint mode
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_OVER);
需要注意下在调用完 DrawableCompat.wrap() 之后, 它的返回值和你赋值给它的那个并不是同一个东西。你应该使用 DrawableCompat.unwrap( ) 取出原始 Drawable。
在内部,我们将你的 Drawable 包裹在一个特殊的 ‘tint drawable’ (着色 drawable) 之中,它会根据指定的色彩自动更新 Drawable 的滤色器。 允许我们处理 ColorStateList 实例。
Palette 在这次发布中也获得了一些更新。首先,我们给它加入了新的 Builder 类来帮助获取 Palette 实例。我们发现 Palette 与日俱增的 ‘把手’ 和 设置 正在将它的 API 变得复杂难懂。 使用 Builders 可以显著缓解这个问题。
更加重要的是第二个改变,我们在很大程度上提升了 Palettes 的生成速度。 在生成 Palette 过程中最耗时的要数 色彩量化这一步,它会读取一张图片中的 所有像素点,并降低颜色深度到一个很小的色彩数 (通常是 16)。
在这次更新中,我们使用了传统的方式优化色彩量化的性能,比如更少的对象分配, 更合适的数据结构还有降低算法复杂度。成果很显著~
下面是一些测试数据,在一个使用 ART 的设备上性能大概提升 5 到 6 倍, 如果是使用 Dalvik 的设备,效果还会更加明显。
Device | 22.0 | 22.1.0 | Speedup |
---|---|---|---|
Nexus 6 | 55ms | 8ms | ~6x |
Nexus 5 | 55ms | 11ms | ~5x |
Nexus One | 1200ms | 120ms | ~10x |
测试结果并不是很科学,只是给出一个近似的值,不过你懂这个意思的啦。
Cover photo:Scaffolding by Brett Weinstein
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。