在上一篇文章中,我們完成了文字時鐘顯示時間的功能,並且釋出到了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 下載文字時鐘的安裝包。