- 实例概述:Android UI设计模拟时钟AnalogClock和数字时钟DigitalClock,在本软件中,首先展示的是AnalogClock模拟时钟,模拟时钟随系统时间的改变而更新,然后在AnalogClock下面显示的是DigitalClock数字时钟,同样随系统时间的改变而更新,在DigitalClock下面为TextView控件,此控件动态显示系统时间。
- 运行效果
本案例运行效果如下图所示:
3.技术实现
在本软件中实现模拟时间只需直接加入控件就可以动态显示系统时间,而实现TextView动态显示时间就比较复杂。实现TextView的时候首先要创建一个线程类,通过此线程的Handler发送消息,主控类接受消息重新获取时间,然后再赋值给TextView,从而实现词控件的动态显示。
- 核心代码
1)布局,activity_main.xml
<AnalogClock
android:id="@+id/AnalogClock01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="90dp"
android:layout_marginTop="30dp"
>
</AnalogClock>
<DigitalClock
android:text="@+id/DigitalClock01"
android:textSize="25dp"
android:id="@+id/DigitalClock01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginLeft="120dp"
>
</DigitalClock>
<TextView
android:id="@+id/TextView01"
android:textSize="25dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:gravity="center"
android:layout_marginTop="20dp"
>
</TextView>
</LinearLayout>
-
MainActivity.java
package com.example.asus.time;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import java.util.Calendar;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {public int mHour; public int mMinute; public int mSecond; Handler hd=new Handler() { @Override public void handleMessage(Message msg) { switch(msg.what) { case 0: long time=System.currentTimeMillis(); final Calendar c=Calendar.getInstance(); c.setTimeInMillis(time); mHour=c.get(Calendar.HOUR); mMinute=c.get(Calendar.MINUTE); mSecond=c.get(Calendar.SECOND); TextView tv=(TextView)findViewById(R.id.TextView01); tv.setText("现在时间是"+String.valueOf(mHour)+":"+String.valueOf(mMinute)+":"+String.valueOf(mSecond)); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyThread thread=new MyThread(this); thread.start(); }
}
-
线程类MyThread.java
package com.example.asus.time;
public class MyThread extends Thread
{
boolean flag=true;//flag为True
MainActivity activity;
public MyThread(MainActivity activity)//构造器
{
this.activity=activity;//为当前的activity赋值
}@Override public void run()//重写的run方法 { while(flag) { try { MyThread.sleep(1000);//休息1000ms } catch(Exception e)//捕获异常 { e.printStackTrace();//打印堆栈信息 } activity.hd.sendEmptyMessage(0);//发送消息0 } }
}
5.实验心得
略。