Android文本时钟 V2 — Part2

在上一篇文章中,我们有选择的更新了文本时钟小部件、锁屏小部件和daydream小部件。使其根据Android系统的版本,改变配色从而迎合新的Android系统KitKat的主题。在这篇文章中,我们会来给它增加一些动画效果。

译注:想了解daydream相关信息店开此传送门,简单来说就是手机的屏保?

要添加动画效果,首先定义一组动画效果。

我们希望为已经存在的文字有设置从左侧滑出的动画效果,所以在res文件夹下的anim文件夹(即res/anim)下新建一个配置文件out_left.xml。内容如下:

同时,我们希望新出现的文字带有从右侧滑进来的动画效果,因此还是在上面相同的目录(res/anim 动画资源文件夹)下新建in_left.xml。内容如下:

这里不会对view的动画效果进行说明。如果对于view动画这一块还不够了解,可以参考Simple Animation这篇文章。

接下来在应用中会多次使用这些动画,所以一开始就创建它们是明智的做法。

我们从daydream开始,因为这个最简单,只需要处理TextView。所以,最简单的方案就是使用控件TextSwitcher,它会帮我们完成大量烦杂的工作。

我们需要在layout代码中用TextSwitcher控件替换TextViewlayout weight(控制布局中各个控件所占空间的比例)保持不变:

我们可以创建一对静态Textview作为TextSwitcher的子控件(即用两个TextView填充TextSwitcher),但一旦创建完成之后的代码就要遵守这种做法。为了展现不同的方案,我们采用工厂模式创建这些子View

TextSwitcher继承自ViewSwitcher,而ViewSwitcher又是ViewAnimator的子类。ViewSwticher支持使用工厂模式建立新的view。每次动画开始时,就会通过工厂模式
建立一个新的view。原来的view在动画效果滑出后,新的view就会使用动画效果滑入。之后,原来view就从ViewSwitcher中移除,这样能够被系统执行垃圾回收。

调用TextSwitchersetText()方法时,会自动完成上述基本操作。我们需要做的是提供创建TextView的对象工厂,这也是必须实现的。这种实现非常适合我们的要求,因为需要定义不同风格以适应小时、分钟的十位、以及个位部分的TextView

你可能会注意到,我们人为地将各TextView控件设置了不同的动画启动延迟。这是因为,我们希望通过视觉效果来对不同的控件做出区分。如果所有动画都是同步进行,看起来会非常呆滞和刻板。但是如果错开动画的开始时间,看上去则会更为有趣。

我们还需要修改一下时间更新逻辑,使其只在真正发生时更新。如果不这么做则会出现,即使时间没有实际改变也会启动动画效果:

好了,是时候看看我们的成果了。当时间改变时,我们会看到这样的动画效果:效果视频

在本文的开始提到了,向daydream添加动画效果是最简单的。一旦我们要对小部件和锁屏部件添加动画效果,事情就变的有一些复杂了。因为我们不能通过布局直接控制对应的view,因此需要通过RemoteViews完成。同时,TextSwitcher也不支持小部件和锁屏部件,所以我们需要采取非传统的策略。下一篇文章,我们会来讨论如何给这些部件也加上动画效果。

本文完整源代码可以在这里找到,文本时钟App可以从Google Play市场下载。与本文对应的2.01版本已经发布,未来几周会添加一些新功能。

收藏 评论

关于作者:DzMonster

简介还没来得及写 :) 个人主页 · 我的文章

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部