在上一篇文章中,我们完成了文本时钟显示时间的功能,并且发布到了Google Play 上。文本时钟的基本功能已完成,但还有一些待优化提升的地方。在这篇文章中,我们将找出这些地方并进行优化。
首先,我们要优化文本时钟的显示字体。现在我们的小程序看起来是这个样子:
“小时”使用加粗字体,“分钟”使用正常字体。分钟字体稍微细一点,会有更加明显的对比效果。幸运的是,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 文件中这样定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="hoursTextWidget"> <item name="android:textSize">@dimen/widget_text_height</item> <item name="android:textColor">@color/holo_blue_bright</item> <item name="android:textStyle">bold</item> </style> <style name="minutesTextWidget" parent="hoursTextWidget"> <item name="android:textColor">@color/holo_blue_light</item> <item name="android:textStyle">normal</item> </style> </resources> |
Android 4.0 或更高版本的系统,使用Roboto字体,Android 4.0 以下的版本,使用Droid Sans 字体。能否在 Android 4.3 系统上用特殊的“light”字体呢? 实现这个功能,需要在 res/values-v16/styles.xml 中新建这样一个文件:
1 2 3 4 5 6 7 8 |
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="minutesTextWidget" parent="hoursTextWidget"> <item name="android:textColor">@android:color/holo_blue_light</item> <item name="android:textStyle">normal</item> <item name="android:fontFamily">sans-serif-light</item> </style> </resources> |
在Android 4.3 设备上重写了分钟显示字体,添加 sans-serif-light 字体库。运行后,可以看到这样的效果:
虽然看起来只有一些细微的改变,但请记住:细节造就完美。
另外需要强调的一点是,在Nexus 10 上字体看起来不是很好看。前面看到的图片是在 Galaxy Nexus 上截图得到的效果,下面是在Nexus 10 上运行的效果:
在Nexus 10 上,显示分钟的“g”底部压在了边框线上, Galaxy Nexus 上没有问题,这是为什么呢?
因为在两个设备不同的像素密度(Galaxy Nexus 316ppi, Nexus 10 300ppi)造成渲染时候的差异。一种解决方式可以将字体变小一点,在 Galaxy Nexus 上渲染效果很好,同样字体也会再变小一点。另一种方式,可以通过管理资源文件创建res/values-xlarge-xhdpi/dimens.xml , 在Nexus 10 设备使字体稍微变小一点。
1 2 3 4 |
<?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="widget_text_height">20dp</dimen> </resources> |
运行后,看起来效果好很多。
我们已经解决了很多不会造成关键问题的小麻烦,优化 App 显示外观,提高可欣赏性。这个版本将作为V1.0.1 发布到Google Play 上。
下一篇文章,我们将向文本时钟小程序添加一些功能。
可以在这里找到本篇文章的源码,可以从Google Play 下载文本时钟的安装包。