Android文本时钟 — Part1
本文由 ImportNew - 余炬鹏 翻译自 stylingandroid。如需转载本文,请先参见文章末尾处的转载要求。
ImportNew注:如果你也对Android技术翻译分享感兴趣,欢迎加入我们的 Android开发 小组。参与方式请查看小组简介。
通常在做Android样式(Styling)时,我们会聚焦于个性化、独立的功能以及Android UI/UX开发技术上。这个系列课程将创建一个简单的应用程序,并发布到Google Play上。这个过程必然会涉及到一些之前没见过的功能和技术点,也会涉及到一些Android 4.2 新特性,与此同时我们也可以看到一些设计理念——尽可能简化应用程序,为其进入市场做好准备。
那么,我们将创建怎样的一个应用程序呢?一个简单的文本时钟小程序。这个想法来源于一个定制的Pebble表,并且我们会在Android上用Holo风格呈现现这个文本时钟。而这个应用程序的初始版本将会是一个能让用户安装在他们手机 home 页上的桌面小程序:
随着学习的进行,发布在Google Play上的文本时钟也会跟着这个教程发布的最新文章同步更新。
我们需要做的第一件事情:创建一个 com.stylingandroid.textclock 包,在目录下创建一个名为 “TextClock” 的Android 4.2 工程文件。个工程文件不包含 Activity —— 后面会添加,目前暂不需要。
接下来,我们看一下文本时间生成类:
public class TimeToWords { public static final String[] UNITS = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; public static final String[] TENS = { "zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; public static final String[] TEENS = { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; private static final StringBuilder builder = new StringBuilder(); public synchronized static String[] timeToWords( Calendar date ) { builder.setLength( 0 ); int h = date.get( Calendar.HOUR_OF_DAY ); int m = date.get( Calendar.MINUTE ); if ( h == 0 ) { builder.append( "midnight" ); } else { toWords( h, builder, false, " " ); } if ( m == 0 ) { if ( h > 0 ) { builder.append( ":o'clock" ); } } else { builder.append( ":" ); toWords( m, builder, true, ":" ); } return builder.toString().split( ":" ); } private static void toWords( final int number, StringBuilder sb, boolean leadingZero, String separator ) { int num = number; int tens = num / 10; if ( leadingZero || tens > 0 ) { if ( tens == 1 ) { sb.append( TEENS[num - 10] ); num = 0; } else { sb.append( TENS[tens] ); } } int units = num % 10; if ( units > 0 ) { if ( sb.length() > 0 ) { sb.append( separator ); } sb.append( UNITS[units] ); } } }
在这里有一些东西需要解释:首先,方法是静态的,所以无需实例化 TimeToWords 对象;它使用了一个静态 SringBuilder 成员,这样在调用 timeTowords() 方法的时可以创建最少的对象。当然,这个方法也有个潜在的问题:如果timeToWords() 方法同时被不同的线程调用,使用同一个 StringBuilder 会出现问题。因此,我们把 timeToWords() 方法声明为synchronized,这样可以确保它一次只能被一个线程调用。希望随着app开发的进行,这种情况不发生。尽管如此,时刻考虑线程安全问题可以防止程序出现预期之外的执行结果。
这里,我们仅仅专注于实现一个24小时标准时钟,但以后也会弄一个12小时标准时钟。在应用中,我们将创建一个包含时间的文本字符串,然后采用 “:” 作为分割符把它分割成不同部分,并以一个字符串数组返回。我们仅用三行显示,但可能在某些环境下会有超过三个需要识别的文字(如“ twenty one fifty five“)。这时我们会把“小时”列为一行(”twenty one”)、“分钟”列两行(“fifty”、“five”)。当然也还有些边界情况,如零点(这里我们把它显示为“midnight”)、零分(这里我们把它显示为整点,如seven o’clock)。
应用程序的主要“引擎”就是实现后台所有的业务逻辑。这个非常简单,所以我们可以专注于UI(呈现给用户的东西)开发。
在下一篇文章,我们将开始讲述如何实现这个能让用户放在其手机 home 页的桌面小程序。
本文的源码在这里,并且你也可以在Google Play上找到此文本时钟应用。
原文链接: stylingandroid 翻译: ImportNew.com - 余炬鹏
译文链接: http://www.importnew.com/8587.html
[ 转载请保留原文出处、译者和译文链接。]
可能感兴趣的文章
- Java的版本历史与特性
- 欢迎来到JavaOne 2012 & 主题曲
- Java多线程面试问题集锦
- Scala教程:简单构建工具SBT
- 2013 Eclipse社区报告
- 如何创建、初始化匿名数组
- 什么是静态(static)?什么是静态方法,静态变量,静态块和静态类?
- 使用Java创建RESTful Web Service
- 深入理解Java中的final关键字
- 安卓的进化—Part2