本文乃是一位Android开发爱好者为大家奉献的一个小人时钟的Android开发实例,作者还简单分享了自己的一些经历和想法,和Android开发学习者门共勉。以下是原文:

       【写在前面】

       我开始关注Android也不过是大约一年前的事,可那时在安装开发环境时遇到重挫,怎么着也没安装成功,无奈之下只好作罢。今年五一放假在家抱着试一试的心态打算重拾Android,没想到开发环境安装得非常顺利,这一下子就点燃了我一年前的热情,于是趁热打铁,一边找来几本Android入门的电子书狂啃,一边照葫芦画瓢就开始了我的Android应用程序开发之旅。几番编码下来,算是摸着点门道了,碰巧公司有个同事是个安卓控,在网上看到一款小人时钟的网页程序(如下截图),觉得非常有意思,可是遍寻安卓市场,却没发现哪儿能够下载,遂鼓动我开发一个。可怎么说我也是刚开始踏上Android开发的漫漫征程,毕竟经验不足,然而初生牛犊不怕虎,说干就开干了。

小人时钟的网页程序截图

       说实话,这个实例对于那些Android大虾们来说,不值一提。这个实例与其说是写给像我一样的广大菜鸟们,倒不如说是写给岁月的一曲离歌---若干年后,就让我们在记忆的尘埃里去寻找那消逝但美丽的青春。

       【开发进行时】

       我的开发环境是Eclipse Classic 3.7.2+Android SDK 2.3.3,具体安装过程在网上一搜一大堆,这儿就不多说了。

       首先,打开Eclipse开发环境,新建一个工程,命名为“LittlePersonClock”。(Eclipse的使用,如怎么建立工程,添加文件等操作,也不在这儿介绍了)。

       然后,将小人时钟的各个数字和“:”截图做成合适的大小(根据分辨率),如下图所示,分别命名为colon.png、n0.png……n9.png,在项目的res下新建一文件夹drawable,之后将这11张图片存放到这个drawable文件夹下面。

小人时钟的11张图片

       然后在main.xml布局文件中采用相对布局(RelativeLayout)方式,增加8个ImageView和一个Button,内容如下:

       //以下是main.xml的内容

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal"  
  6.     android:background="#FFFFFFFF" >  
  7.   
  8. <ImageView  
  9.     android:id="@+id/iHourHigh"  
  10.     android:layout_width="wrap_content"  
  11.     android:layout_height="wrap_content"  
  12.     android:layout_alignBottom="@+id/iHourLow"  
  13.     android:layout_marginTop="100dip"  
  14.     android:layout_marginLeft="10dip"  
  15.     android:src="@drawable/n0" >  
  16.   
  17. </ImageView>  
  18.   
  19. <ImageView  
  20.     android:id="@+id/iHourLow"  
  21.     android:layout_width="wrap_content"  
  22.     android:layout_height="wrap_content"  
  23.     android:layout_alignBottom="@+id/tColonHM"  
  24.     android:layout_marginLeft="1dip"  
  25.     android:layout_marginTop="100dip"  
  26.     android:layout_toRightOf="@id/iHourHigh"  
  27.     android:src="@drawable/n1" >  
  28.   
  29. </ImageView>    
  30.   
  31. <ImageView    
  32.     android:id="@+id/tColonHM"  
  33.     android:layout_marginTop="100dip"  
  34.     android:src="@drawable/colon"  
  35.     android:layout_width="wrap_content"  
  36.     android:layout_height="wrap_content"  
  37.     android:layout_toRightOf="@id/iHourLow"  
  38.     android:layout_marginLeft="1dip"/>    
  39.   
  40. <ImageView  
  41.     android:id="@+id/iMinuteHigh"  
  42.     android:layout_width="wrap_content"  
  43.     android:layout_height="wrap_content"  
  44.     android:layout_above="@+id/btnReturn"  
  45.     android:layout_marginLeft="1dip"  
  46.     android:layout_marginTop="100dip"  
  47.     android:layout_toRightOf="@id/tColonHM"  
  48.     android:src="@drawable/n2" >  
  49.   
  50. </ImageView>  
  51. <ImageView    
  52.     android:id="@+id/iMinuteLow"  
  53.     android:src="@drawable/n3"  
  54.     android:layout_marginTop="100dip"  
  55.     android:layout_width="wrap_content"  
  56.     android:layout_height="wrap_content"  
  57.     android:layout_toRightOf="@id/iMinuteHigh"  
  58.     android:layout_marginLeft="1dip">  
  59. </ImageView>       
  60.   
  61. <ImageView    
  62.     android:id="@+id/tColonMS"  
  63.     android:layout_marginTop="100dip"  
  64.     android:src="@drawable/colon"  
  65.     android:layout_width="wrap_content"  
  66.     android:layout_height="wrap_content"  
  67.     android:layout_toRightOf="@id/iMinuteLow"  
  68.     android:layout_marginLeft="1dip"/>  
  69.   
  70. <ImageView    
  71.     android:id="@+id/iSecondHigh"  
  72.     android:src="@drawable/n5"  
  73.     android:layout_marginTop="100dip"  
  74.     android:layout_width="wrap_content"  
  75.     android:layout_height="wrap_content"  
  76.     android:layout_toRightOf="@id/tColonMS"  
  77.     android:layout_marginLeft="1dip">  
  78.        
  79. </ImageView>  
  80.   
  81. <ImageView    
  82.     android:id="@+id/iSecondLow"  
  83.     android:src="@drawable/n6"  
  84.     android:layout_marginTop="100dip"  
  85.     android:layout_width="wrap_content"  
  86.     android:layout_height="wrap_content"  
  87.     android:layout_toRightOf="@id/iSecondHigh"  
  88.     android:layout_marginLeft="1dip">  
  89. </ImageView>       
  90.   
  91. <Button    
  92.     android:id="@+id/btnExit"  
  93.     android:layout_width="wrap_content"  
  94.     android:layout_height="wrap_content"  
  95.     android:layout_below="@id/tColonMS"  
  96.     android:text="退出"  
  97.     android:layout_marginTop="50dip"  
  98.     android:layout_marginLeft="100dip"  
  99.     android:textSize="20dp"/>  
  100.   
  101. </RelativeLayout>  

       然后在代码LittlePersonClock.java中具体实现小人时钟。

       //以下是源代码

Java代码
  1. package com.littlepersonclock.kernel;   
  2.   
  3. import java.util.Calendar;   
  4. import java.util.Timer;   
  5. import java.util.TimerTask;   
  6. import android.app.Activity;   
  7. import android.os.Bundle;   
  8. import android.os.Handler;   
  9. import android.os.Message;   
  10. import android.view.View;   
  11. import android.widget.Button;   
  12. import android.widget.ImageView;   
  13.   
  14. public class LittlePersonClock extends Activity {   
  15.   
  16.     private ImageView ivhh=null,ivhl=null;   
  17.     private ImageView ivmh=null,ivml=null;   
  18.     private ImageView ivsh=null,ivsl=null;   
  19.     private Button btnExit=null;   
  20.     private Timer timer=new Timer();   
  21.     int i=0,hour,minute,second;   
  22.     Calendar c=null;   
  23.     int amorpm=0;   
  24.     final int did[]={R.drawable.n0,R.drawable.n1,R.drawable.n2,R.drawable.n3,R.drawable.n4,   
  25.                      R.drawable.n5,R.drawable.n6,R.drawable.n7,R.drawable.n8,R.drawable.n9};      
  26. //实际上的用法应该通过配合Handler来实现timer功能,这跟Android的线程安全有关!   
  27.     Handler handler = new Handler(){      
  28.         public void handleMessage(Message msg) {      
  29.             switch (msg.what) {          
  30.             case 1:          
  31.                 c=Calendar.getInstance();   
  32.                 amorpm = c.get(Calendar.AM_PM);   
  33.                 hour   = c.get(Calendar.HOUR);   
  34.                 if(amorpm==Calendar.PM)   
  35.                     hour+=12;   
  36.                 minute = c.get(Calendar.MINUTE);   
  37.                 second = c.get(Calendar.SECOND);   
  38.                    
  39.     ivhh.setImageResource(did[(int)(hour/10)]); ivhl.setImageResource(did[hour%10]);   
  40.     ivmh.setImageResource(did[(int)(minute/10)]);   
  41.     ivml.setImageResource(did[minute%10]);   
  42.     ivsh.setImageResource(did[(int)(second/10)]);   
  43.     ivsl.setImageResource(did[second%10]);      
  44.                 break;          
  45.             }          
  46.             super.handleMessage(msg);      
  47.         }      
  48.     };   
  49.        
  50.     TimerTask task = new TimerTask() {   
  51.             @Override              
  52.             public void run() {   
  53.                 Message message = new Message();          
  54.                 message.what = 1;          
  55.                 handler.sendMessage(message);     
  56.             }   
  57.             };   
  58.     protected void onDestroy()   
  59.     {   
  60.         if (timer != null) {   
  61.             timer.cancel();   
  62.             timer = null;   
  63.             }   
  64.         super.onDestroy();   
  65.     }          
  66.     public void onCreate(Bundle savedInstanceState) {   
  67.         super.onCreate(savedInstanceState);   
  68.         setContentView(R.layout.main);          
  69.   
  70.         ivhh = (ImageView)findViewById(R.id.iHourHigh);   
  71.         ivhl = (ImageView)findViewById(R.id.iHourLow);   
  72.         ivmh = (ImageView)findViewById(R.id.iMinuteHigh);   
  73.         ivml = (ImageView)findViewById(R.id.iMinuteLow);   
  74.         ivsh = (ImageView)findViewById(R.id.iSecondHigh);   
  75.         ivsl = (ImageView)findViewById(R.id.iSecondLow);   
  76.         c=Calendar.getInstance();   
  77.         amorpm = c.get(Calendar.AM_PM);   
  78.         hour   = c.get(Calendar.HOUR);   
  79.         if(amorpm==Calendar.PM)   
  80.             hour+=12;   
  81.         minute = c.get(Calendar.MINUTE);   
  82.         second = c.get(Calendar.SECOND);   
  83.            
  84.         ivhh.setImageResource(did[(int)(hour/10)]);   
  85.         ivhl.setImageResource(did[hour%10]);   
  86.         ivmh.setImageResource(did[(int)(minute/10)]);   
  87.         ivml.setImageResource(did[minute%10]);   
  88.         ivsh.setImageResource(did[(int)(second/10)]);   
  89.         ivsl.setImageResource(did[second%10]);   
  90.   
  91.         timer.schedule(task,1000,1000);   
  92.         btnExit = (Button)findViewById(R.id.btnExit);   
  93.         btnExit.setOnClickListener(new Button.OnClickListener(){   
  94.             public void onClick(View v)   
  95.             {   
  96.                 LittlePersonClock.this.onDestroy();   
  97.             }   
  98.         });   
  99.     }   
  100. }  

       【测试效果】

       编译后打开模拟器,在模拟器上测试效果还行,以下是截图(只是无法看动态的现实):

Android小人时钟

       【写在后面】

       限于水平和经验,这个实例肯定还有很多不完善的地方,况且我这个人一向懒于动笔,疏于总结,本文写得也只能点到为止---要是看不懂,实在不是你的错!

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/236.html
2012年10月15日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:0