在2015年GoogleI/O大会上发布了Material Design支持库,使用它设计目标版本在API19以下的material应用瞬间变得十分轻松。在这个系列中我们将以RSS阅读器做为material系列的基础,并且完全使用新的设计支持库重写这个应用。本文中我们将看到设计支持库的新组件在旧版本Android上如何完美工作。
在看过Vandana Shah、Ian Lake和Chris Bannes在2015年GoogleI/O上展示的设计支持库后,我首先好奇这个库是怎么在旧版本Android上工作的。我注意到有一页幻灯片展示了点击Tabayout中一个标签所呈现的漂亮的涟漪效果,然后想到这个效果不大可能移植到低版本中。我就这个问题询问过Chris,他十分愿意分享一些关于向后兼容问题的见解,这些观点是这篇文章的基础。
让我们从首先注意到的事情开始——涟漪触摸反馈。我认为很难向后兼容的原因是它们是如何渲染的。Lollipop的一个底层改变是渲染线程,这个线程与标准UI线程一起并行工作。渲染线程允许动画(如涟漪效果)有别于其他UI任务,在单独的线程中进行渲染来保证高帧率,使用户感觉动画效果十分平滑。通常一个触摸事件将触发一大堆UI线程上的任务(如Activity切换,或更新一个布局)。因此,在同一个线程上处理所有事情将使得涟漪动画的帧率迅速降低。在Lollipop之前的版本上,由于缺少专用渲染线程,使得涟漪效果是不大可能实现。
那么在Lollipop之前版本的的设备上,触感反馈是什么样的呢?让我们在Jelly Bean上试试,来看看是什么效果:
棒极了!看一看标签上的触感反馈,没有涟漪效果,但是这确实是正常的Lollipop早先版本的样式。这有点模糊,这是因为我们主题中为collorControlHighlight参数选择的颜色(与导航抽屉的选择状态共享)——很容易纠正它。这是用户(可能不会)注意到的唯一真正不同。
除了不同的触摸反馈,还有其它的不同么?实际上还有另一个很细微的区别,但它太细微以至于当你搜索它的时候也很难发现,这就是FAB上的阴影渲染。Lollipop引入了一些强有力的阴影渲染技术以及elevation和translationZ,而这在低于Lollipop版本上是不可能的。尽管你不知道它,但是阴影渲染相当棒。即使存在解除指触行为,并且它看起来不错。
那么我在更老的Android版本——姜饼(API 10)上试试会怎么样:
在我们的WebView中,有一些明显的渲染问题,但这与设计支持库无关,可以忽略它。
我们看到主要问题是Toolbar和Tabayout中文字颜色是错误的。我猜可能是亮主题中没有darActionBar的概念,因为在API 11蜂巢发布之前没有ActionBar的概念。
另一个值得注意的是随着Snackbar的出现,我们没有让FAB起作用。Chris解释到,因为蜂巢版本前没有translationY,因此不大可能实现依赖translationY的属性动画。
总而言之,结果仍然相当不错。如这个系列中所见,我们仍然得到了其它美妙的东西,尽管有些方面不支持,行为尽可能优雅地降级,结果仍然非常有用。
总而言之,设计支持库十分强大,并且向我们提供了十分有用的工具集。它们既容易使用又完美的向后兼容。万分感谢Chris以及设计支持库背后的其他成员们。
到这里我们将结束这个系列,因为我们结束了RSS阅读器应用中的例子——至少可以说,在应用中使用FAB是脆弱的。不过不用担心,在后续文章中,我们将探索更多的特性,行为和很酷的东西。下周开始——持续关注。
本文中我们没有修改任何代码,前面文章的源码可以在这里找到。