Android文本时钟 — Part1

通常在做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
[ 转载请保留原文出处、译者和译文链接。]



相关文章

发表评论

Comment form

(*) 表示必填项

2 条评论

  1. brant 说道:

    java代码用这种大括号风格真心看着不舒服。

    Thumb up 0 Thumb down 0

    • 唐尤华 说道:

      已经发现了,原文的代码格式看起来有点不合“习惯”。感谢brant的提醒:)

      Thumb up 0 Thumb down 0

跳到底部
返回顶部