Android 计时应用 之 爱相随 V0.1
女朋友一直钟情于Android手机,前段时间不幸丢了陪伴多年的手机,便买了中兴U880。
也和她聊起过Android手机应用,认为手机应用最大的功能就是:显示,当时也便许诺送她一款自己开发的Android手机应用。
怎乃本人毫无Java基础,没接触过Android开发,既然答应了就从最简单的开始吧。
想起从我2011年4月28日表白到今天也有200多天了,便萌发了编写这个最简单的,记录我们相爱时间的Android计时应用:爱相随(Love Plus)
注:Ubuntu 11.04 下安装Android开发环境破费周折,主要就是再使用eclipse安装ADT插件是总提示缺少wst。最终换用了HELIOS版本的eclipse才顺利通过。
开发环境:Ubuntu 11.04 、 eclipse HELIOS、Android 2.2
程序结构:
布局文件:time.xml代码:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:background="@drawable/love"
6 android:orientation="vertical" >
7
8 <LinearLayout
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:orientation="horizontal"
12 android:layout_weight="200">
13 </LinearLayout>
14 <LinearLayout
15 android:layout_width="wrap_content"
16 android:layout_height="wrap_content"
17 android:orientation="horizontal"
18 android:layout_weight="1">
19 <TextView
20 android:id="@+id/myLove"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 style="@style/MyTextLove"
24 android:text="@string/love"/>
25 </LinearLayout>
26
27 <LinearLayout
28 android:layout_width="fill_parent"
29 android:layout_height="32dip"
30 android:orientation="horizontal"
31 android:layout_weight="1">
32
33
34 <TextView
35 android:id="@+id/Days"
36 android:layout_width="fill_parent"
37 android:layout_height="wrap_content"
38 android:layout_weight="3"
39 style="@style/MyText"/>
40 <TextView
41 android:id="@+id/DaysChinese"
42 android:layout_width="fill_parent"
43 android:layout_height="wrap_content"
44 android:layout_weight="4"
45 style="@style/MyTextChinese"
46 android:text="@string/days"/>
47 <TextView
48 android:id="@+id/Hours"
49 android:layout_width="fill_parent"
50 android:layout_height="wrap_content"
51 android:layout_weight="4"
52 style="@style/MyText"/>
53 <TextView
54 android:id="@+id/HoursChinese"
55 android:layout_width="fill_parent"
56 android:layout_height="wrap_content"
57 android:layout_weight="4"
58 style="@style/MyTextChinese"
59 android:text="@string/hours"/>
60 <TextView
61 android:id="@+id/Minutes"
62 android:layout_weight="4"
63 android:layout_width="fill_parent"
64 android:layout_height="wrap_content"
65 style="@style/MyText"/>
66 <TextView
67 android:id="@+id/MinutesChinese"
68 android:layout_width="fill_parent"
69 android:layout_height="wrap_content"
70 android:layout_weight="4"
71 style="@style/MyTextChinese"
72 android:text="@string/minutes"/>
73 <TextView
74 android:id="@+id/Seconds"
75 android:layout_weight="4"
76 android:layout_width="fill_parent"
77 android:layout_height="wrap_content"
78 style="@style/MyText"/>
79 <TextView
80 android:id="@+id/SecondsChinese"
81 android:layout_width="fill_parent"
82 android:layout_height="wrap_content"
83 android:layout_weight="4"
84 style="@style/MyTextChinese"
85 android:text="@string/seconds"/>
86 </LinearLayout>
87 </LinearLayout>
说明:其实就是一个LinearLayout里面签到三个vertical布局的LinearLayout,其中前两个LinearLayout无特殊处理,背景设为透明。第三哥之中为horizontal布局着8哥TextView。期间的layout_weight调整一直不太明白 。
求助:我设想的最好是只有两个LinearLayout嵌套,里面的LinearLayout与外面的LinearLayout 下端对齐,可是一直没找到实现方法,特此求助大家,谢谢!
字符文件:string.xml代码:
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 <string name="hello">Hello World, YTLFEActivity!</string>
4 <string name="app_name">Love Plus</string>
5 <string name="previous_page">上一页</string>
6 <string name="next_page">下一页</string>
7 <string name="love">We have fall in love with each other for:</string>
8 <string name="days">天</string>
9 <string name="hours">时</string>
10 <string name="minutes">分</string>
11 <string name="seconds">秒</string>
12 <string name="prompt">宝贝,我爱你</string>
13 <string name="quit_msg">记得常来看看啊...</string>
14 <string name="confirm">我也爱你</string>
15 <string name="cancel">我还想再看一会</string>
16 </resources>
注:其中的previous_page,next_page是参考他人代码是加入验证的,现在还没有作用。暂且留做以后开发之用吧。
风格文件:style.xml代码:
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 <style name="MyText" parent="@android:style/TextAppearance">
4 <item name="android:textColor">#F2F2F2</item>
5 <item name="android:textSize">16sp</item>
6 <item name="android:typeface">serif</item>
7 <item name="android:gravity">right</item>
8 <item name="android:background">#606060</item>
9
10 </style>
11 <style name="MyTextChinese" parent="@android:style/TextAppearance">
12 <item name="android:textColor">#F2F2F2</item>
13 <item name="android:textSize">16sp</item>
14 <item name="android:typeface">serif</item>
15 <item name="android:gravity">center</item>
16 <item name="android:background">#606060</item>
17 </style>
18 <style name="MyTextLove" parent="@android:style/TextAppearance">
19 <item name="android:textColor">#A2A2A2</item>
20 <item name="android:textSize">11sp</item>
21 <item name="android:typeface">serif</item>
22 <item name="android:gravity">left</item>
23 <item name="android:background">@android:color/transparent</item>
24 </style>
25 </resources>
主程序代码:
1 package com.yunantong.love;
2
3 import android.app.Activity;
4 import android.app.AlertDialog;
5 import android.content.DialogInterface;
6 import android.os.Bundle;
7 import android.os.Handler;
8 import android.os.Message;
9 import android.view.KeyEvent;
10 import android.widget.TextView;
11
12 public class YTLFEActivity extends Activity {
13 /** Called when the activity is first created. */
14 private static final int msgKey1 = 1;
15 private TextView mDays;
16 private TextView mHours;
17 private TextView mMinutes;
18 private TextView mSeconds;
19 @Override
20 public void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 setContentView(R.layout.time);
23 mDays = (TextView) findViewById(R.id.Days);
24 mHours = (TextView) findViewById(R.id.Hours);
25 mMinutes = (TextView) findViewById(R.id.Minutes);
26 mSeconds = (TextView) findViewById(R.id.Seconds);
27 new TimeThread().start();
28 }
29 public class TimeThread extends Thread{
30 @Override
31 public void run(){
32 do{
33 try{
34 Thread.sleep(1000);
35 Message msg = new Message();
36 msg.what = msgKey1;
37 mHandler.sendMessage(msg);
38 }
39 catch (InterruptedException e){
40 e.printStackTrace();
41 }
42 }while(true);
43 }
44 }
45 private Handler mHandler = new Handler(){
46 @Override
47 public void handleMessage (Message msg){
48 super.handleMessage(msg);
49 switch (msg.what){
50 case msgKey1:
51 long sysTime = System.currentTimeMillis();
52 long sysTimeDays;
53 long sysTimeHours;
54 long sysTimeMinutes;
55 long sysTimeSeconds;
56 sysTime = (sysTime/1000)-1303968640;
57 sysTimeDays = sysTime/86400;
58 sysTimeHours = (sysTime%86400)/3600;
59 sysTimeMinutes = ((sysTime%86400)%3600)/60;
60 sysTimeSeconds = ((sysTime%86400)%3600)%60;
61 String strDays = String.valueOf(sysTimeDays);
62 String strHours = String.valueOf(sysTimeHours);
63 String strMinutes = String.valueOf(sysTimeMinutes);
64 String strSeconds = String.valueOf(sysTimeSeconds);
65 mDays.setText(strDays);
66 if(sysTimeHours < 10)
67 mHours.setText("0"+strHours);
68 else
69 mHours.setText(strHours);
70 if(sysTimeMinutes < 10)
71 mMinutes.setText("0"+strMinutes);
72 else
73 mMinutes.setText(strMinutes);
74 if(sysTimeSeconds < 10)
75 mSeconds.setText("0"+strSeconds);
76 else
77 mSeconds.setText(strSeconds);
78 break;
79
80 default:
81 break;
82 }
83
84 }
85 };
86 public boolean onKeyDown(int keyCode, KeyEvent event) {
87 if (keyCode == KeyEvent.KEYCODE_BACK) {
88 new AlertDialog.Builder(this)
89 // .setIcon(R.drawable.services)
90 .setTitle(R.string.prompt)
91 .setMessage(R.string.quit_msg)
92 .setNegativeButton(R.string.cancel,
93 new DialogInterface.OnClickListener() {
94 @Override
95 public void onClick(DialogInterface dialog,
96 int which) {
97 }
98 })
99 .setPositiveButton(R.string.confirm,
100 new DialogInterface.OnClickListener() {
101 public void onClick(DialogInterface dialog,
102 int whichButton) {
103 finish();
104 }
105 }).show();
106 return true;
107 } else {
108 return super.onKeyDown(keyCode, event);
109 }
110 }
111 //彻底退出程序
112 @Override
113 protected void onDestroy() {
114 super.onDestroy();
115 System.exit(0);
116 // 或者下面这种方式
117 // android.os.Process.killProcess(android.os.Process.myPid());
118 }
119 }
程序运行效果图:
程序界面:
退出界面:
后记:第一次编写android应用代码,毫无头绪,查找资料,了解结构,这个应用花了一天半的时间,也算基本成型吧。
在此基础上下一步的改进:1、数字显示更美管一些,想使用android内置的时钟风格,或者调整闹钟那样的风格
2、可以换背景那个图片(女朋友提出的)
3、添加背景音乐(女朋友提出的)
4、界面做成3D效果的,这个难度怎么样啊?
5、逐步添加其他功能吧,也当学习之用。