Android文本时钟 — Part1

ImportNew  •  扫码分享
我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  
分享到:


本文由 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

随意打赏

提交建议
微信扫一扫,分享给好友吧。