Android文本时钟 — Part5

683 查看

上一篇文章中,我们完成了文本时钟显示时间的功能,并且发布到了Google Play 上。文本时钟的基本功能已完成,但还有一些待优化提升的地方。在这篇文章中,我们将找出这些地方并进行优化。

首先,我们要优化文本时钟的显示字体。现在我们的小程序看起来是这个样子:

android_textclock_part5_1

“小时”使用加粗字体,“分钟”使用正常字体。分钟字体稍微细一点,会有更加明显的对比效果。幸运的是,Roboto(Android 4.0的默认字体)有一种特殊的“light”字体,可以很好的满足我们的要求。但这也造成一个问题,这种特殊的“light”字体是在Android 4.3 版本中引入的,只在该版本的设备上可用。而且,直到在Android 4.0 版本中,才将Roboto作为默认字体,如何兼容低版本的设备呢(我们的app要兼容到Android 1.5)?

一种可行的方法是,在APK安装包中添加运行时动态加载的自定义字体。Andreas Nislsson 写过一篇非常精彩的文章详细讲述了如何使用该方法,并且提供了一些优化技巧。运行时加载自定义字体,是一种很不错的解决方法,但还有一个问题。

现在(译注:文章写于2013年3月)的安卓版本(Android 4.3)还不支持使用XML或者styles文件自定义字体。目前还没有提供将XML映射到主题的机制,因此必须手动加载。可以在代码中调用 TextView 的 setTypeface() 方法,但是不能直接得到TextView 对象。可以使用 RemoteViews 得到窗体小部件(Widget)的布局视图,但这个类不支持在代码中动态改变 TextView字体。

除了努力向后兼容文本时钟的显示字体,我们也可以换种方式——修改现有设备已支持的字体。Android 4.0之前,使用系统默认的字体,Android4.0使用Roboto字体,Android 4.3使用特殊的“light”的字体。实际上,在用户个人的设备上保持显示字体的一致性,也是一种明智的解决方法。如果用户在他的设备上看到,所有的 App 都在使用 Droid Sans 字体,那我们的 App 使用Droid Sans 字体也就合情合理。

如何实现这样的功能呢?实际上很简单,不必在很多地方引用 Roboto 字体,只要在 Styles.xml 文件中这样定义:

Android 4.0 或更高版本的系统,使用Roboto字体,Android 4.0 以下的版本,使用Droid Sans 字体。能否在 Android 4.3 系统上用特殊的“light”字体呢? 实现这个功能,需要在 res/values-v16/styles.xml 中新建这样一个文件:

在Android 4.3 设备上重写了分钟显示字体,添加 sans-serif-light 字体库。运行后,可以看到这样的效果:

android_textclock_part5_2

虽然看起来只有一些细微的改变,但请记住:细节造就完美。

另外需要强调的一点是,在Nexus 10 上字体看起来不是很好看。前面看到的图片是在 Galaxy Nexus 上截图得到的效果,下面是在Nexus 10 上运行的效果:

android_textclock_part5_3

在Nexus 10 上,显示分钟的“g”底部压在了边框线上, Galaxy Nexus 上没有问题,这是为什么呢?

因为在两个设备不同的像素密度(Galaxy Nexus 316ppi, Nexus 10 300ppi)造成渲染时候的差异。一种解决方式可以将字体变小一点,在 Galaxy Nexus 上渲染效果很好,同样字体也会再变小一点。另一种方式,可以通过管理资源文件创建res/values-xlarge-xhdpi/dimens.xml , 在Nexus 10 设备使字体稍微变小一点。

运行后,看起来效果好很多。

android_textclock_part5_4

我们已经解决了很多不会造成关键问题的小麻烦,优化 App 显示外观,提高可欣赏性。这个版本将作为V1.0.1 发布到Google Play 上。

下一篇文章,我们将向文本时钟小程序添加一些功能。

可以在这里找到本篇文章的源码,可以从Google Play 下载文本时钟的安装包。