Android实现APP秒表功能
本文实例为大家分享了android实现app秒表功能的具体代码,供大家参考,具体内容如下
这几天一直在看安卓,也正好赶上老师布置的作业,所以就做了一个秒表。自己参考了一下别人的图标,有了一些灵感所以顺便也设计了一下界面。下面先贴一下秒表的界面:
打开秒表后的第一个界面

点击开始计时,开始键变为暂停,记录和停止开始变实:

点击记录:

记录满了之后自动上移,通过滑动可以查看前面的:

点击暂停:

停止:

重新开始和记录:

双击返回键退出:

下面贴出activity的代码:
package com.example.stopwatch;
import java.util.timer;
import java.util.timertask;
import android.r.bool;
import android.app.activity;
import android.app.alertdialog;
import android.app.alertdialog.builder;
import android.app.dialog;
import android.content.dialoginterface;
import android.content.intent;
import android.content.res.assetmanager;
import android.content.res.colorstatelist;
import android.graphics.color;
import android.graphics.typeface;
import android.graphics.drawable.drawable;
import android.os.bundle;
import android.os.handler;
import android.os.message;
import android.text.html;
import android.view.gravity;
import android.view.keyevent;
import android.view.menu;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.scrollview;
import android.widget.textview;
import android.widget.toast;
public class mainactivity extends activity {
private boolean mstart = false;
private long mstarttime;
private boolean misrecorded;
private linearlayout linearlayout;
private int recordtimes;
private long currenttime;
private long lasttime = 0;
private long tmptime;
private boolean isexit = false;
//更新显示时间的关键
private handler mhandler = new handler() {
public void handlemessage(message msg) {
switch (msg.what) {
case 1:
if (mstart) {
updatetime();
mhandler.sendemptymessage(1);
}
break;
case 0:
break;
default:
break;
}
}
};
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
textview textview1 = (textview) findviewbyid(r.id.textview1);
textview textview2 = (textview) findviewbyid(r.id.textview2);
//修改时间的字体
assetmanager mgr=getassets();//得到assetmanager
typeface tf=typeface.createfromasset(mgr, "fonts/lanting.ttf");//根据路径得到typeface
textview1.settypeface(tf);
textview2.settypeface(tf);
final button button_start = (button) findviewbyid(r.id.button_start);
final button button_record = (button) findviewbyid(r.id.button_record);
final button button_stop = (button) findviewbyid(r.id.button_stop);
button_start.settext("开始");
//监听开始按钮
button_start.setonclicklistener(new onclicklistener(){
public void onclick(view v)
{
if(button_start.gettext() == "开始") {
mstart = true;
mstarttime = system.currenttimemillis();
button_start.settext("暂停");
button_record.setbackgroundresource(r.drawable.button_record_full);
button_stop.setbackgroundresource(r.drawable.button_stop_full);
lasttime = 0;
recordtimes = 0;
linearlayout = (linearlayout) findviewbyid(r.id.linearlayout1);
linearlayout.removeallviewsinlayout();
mhandler.sendemptymessage(1);
}
else if(button_start.gettext() == "暂停"){
mstart = false;
tmptime = system.currenttimemillis();
button_start.settext("继续");
button_record.setbackgroundresource(r.drawable.button_record_half);
mhandler.sendemptymessage(0);
}
else {
mstart = true;
long tmp = system.currenttimemillis() - tmptime;
mstarttime = mstarttime + tmp;
button_start.settext("暂停");
button_record.setbackgroundresource(r.drawable.button_record_full);
mhandler.sendemptymessage(1);
}
}
});
//监听停止按钮
button_stop.setonclicklistener(new onclicklistener() {
public void onclick(view arg0) {
// todo auto-generated method stub
if(button_start.gettext() != "开始"){
mstart = false;
button_start.settext("开始");
button_stop.setbackgroundresource(r.drawable.button_stop_half);
button_record.setbackgroundresource(r.drawable.button_record_half);
textview textview1 = (textview) findviewbyid(r.id.textview1);
textview textview2 = (textview) findviewbyid(r.id.textview2);
textview1.settext("00:00:00");
textview2.settext("00");
}
}
});
//监听记录按钮
button_record.setonclicklistener(new onclicklistener() {
public void onclick(view arg0) {
// todo auto-generated method stub
if(button_start.gettext() == "暂停"){
misrecorded = true;
mhandler.sendemptymessage(1);
}
}
});
}
//更新显示时间和显示记录的时间
private void updatetime() {
textview textview1 = (textview) findviewbyid(r.id.textview1);
textview textview2 = (textview) findviewbyid(r.id.textview2);
currenttime = system.currenttimemillis();
long atime = currenttime - mstarttime;
stringbuilder[] sb1 = new stringbuilder[2];
sb1[0] = new stringbuilder();
sb1[1] = new stringbuilder();
sb1 = gettimeformat(atime);
string str;
textview1.settext(sb1[0]);
textview2.settext(sb1[1]);
if(misrecorded) {
recordtimes++;
string rec;
long btime;
if (recordtimes == 1) {
btime = atime;
}
else {
btime = currenttime - lasttime;
}
stringbuilder[] sb2 = new stringbuilder[2];
sb2[0] = new stringbuilder();
sb2[1] = new stringbuilder();
sb2 = gettimeformat(btime);
if(recordtimes < 10)
{
rec = '0' + string.valueof(recordtimes);
}
else {
rec = string.valueof(recordtimes);
}
str = "<font color='orange'>" + rec + "</font>" + " <small>" + sb2[0].tostring() +"." + sb2[1].tostring() + "</small>" + " ";
str += "<b>" + sb1[0].tostring() + ".<small>" + sb1[1].tostring() + "</small>" + "</b>";
charsequence charsequence = html.fromhtml(str);
textview text1 = new textview(this);
text1.settext(charsequence);
text1.settextsize(23);
text1.settextcolor(color.white);
text1.setgravity(gravity.center);
assetmanager mgr=getassets();//得到assetmanager
typeface tf=typeface.createfromasset(mgr, "fonts/lanting.ttf");//根据路径得到typeface
text1.settypeface(tf);
textview text2 = new textview(this);
text2.settext(" ");
text2.settextsize(10);
linearlayout.addview(text2);
linearlayout.addview(text1);
final scrollview scrollview = (scrollview) findviewbyid(r.id.scrollview1);
runnable mscrolltobottom = new runnable()
{
@override
public void run()
{
int off = linearlayout.getmeasuredheight() - scrollview.getheight();
if (off > 0)
{
scrollview.scrollto(0, off);
}
}
};
mhandler.post(mscrolltobottom);
misrecorded =false;
lasttime = currenttime;
}
}
//把毫秒转为要显示的格式
public stringbuilder[] gettimeformat(long time) {
long tmp = time;
time = time / 1000;
int second = (int) (time % 60);
int minute = (int) (time / 60) % 60;
int hour = (int) (time / 3600);
int minsecond = (int) (tmp / 10 % 100);
stringbuilder[] sb = new stringbuilder[2];
sb[0] = new stringbuilder();
sb[1] = new stringbuilder();
if(hour < 10) {
sb[0].append('0');
sb[0].append(string.valueof(hour));
}
else {
sb[0].append(string.valueof(hour));
}
sb[0].append(':');
if(minute < 10) {
sb[0].append('0');
sb[0].append(string.valueof(minute));
}
else {
sb[0].append(string.valueof(minute));
}
sb[0].append(':');
if(second < 10) {
sb[0].append('0');
sb[0].append(string.valueof(second));
}
else {
sb[0].append(string.valueof(second));
}
if(minsecond < 10) {
sb[1].append('0');
sb[1].append(minsecond);
}
else {
sb[1].append(minsecond);
}
return sb;
}
//监听返回键,实现点击返回键时弹出对话,连续两次点击退出
@override
public boolean onkeydown(int keycode, android.view.keyevent event) {
if (keycode == keyevent.keycode_back && event.getrepeatcount() == 0) {
toast();
return false;
}
else if (keycode == keyevent.keycode_back && event.getrepeatcount() == 1) {
mainactivity.this.finish();
}
return false;
};
/*protected void gialog() {
// todo auto-generated method stub
alertdialog.builder builder = new builder(mainactivity.this);
builder.settitle("提示");
builder.setmessage("确定要退出吗?");
builder.setpositivebutton("确认",
new android.content.dialoginterface.onclicklistener() {
@override
public void onclick(dialoginterface dialog, int which) {
dialog.dismiss();
mainactivity.this.finish();
}
});
builder.setnegativebutton("取消",
new android.content.dialoginterface.onclicklistener() {
@override
public void onclick(dialoginterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}*/
protected void toast() {
timer texit = null;
if (isexit == false) {
isexit = true; // 准备退出
toast texttoast = toast.maketext(this, "小样!想退出?!", toast.length_long);
texttoast.show();
texit = new timer();
texit.schedule(new timertask() {
@override
public void run() {
isexit = false; // 取消退出
}
}, 2000); // 如果2秒钟内没有按下返回键,则启动定时器取消掉刚才执行的任务
}
else {
finish();
system.exit(0);
}
}
@override
public boolean oncreateoptionsmenu(menu menu) {
// inflate the menu; this adds items to the action bar if it is present.
getmenuinflater().inflate(r.menu.activity_main, menu);
return true;
}
}布局文件的代码:
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <imageview android:id="@+id/imageview1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignparentleft="true" android:src="@drawable/backguand_new" android:scaletype="fitcenter"/> <button android:id="@+id/button_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:layout_centerhorizontal="true" android:layout_marginbottom="12dp" android:text="开始" android:textcolor="#ffffff" android:background="@drawable/button_start_full"/> <button android:id="@+id/button_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/button_start" android:layout_alignbottom="@+id/button_start" android:layout_marginleft="29dp" android:layout_torightof="@+id/button_start" android:background="@drawable/button_stop_half" android:text="停止" android:textcolor="#ffffff" /> <button android:id="@+id/button_record" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/button_start" android:layout_alignbottom="@+id/button_start" android:layout_marginright="28dp" android:layout_toleftof="@+id/button_start" android:background="@drawable/button_record_half" android:text="记录" android:textcolor="#ffffff" /> <imageview android:id="@+id/imageview2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/button_start" android:layout_centerhorizontal="true" android:layout_marginbottom="20dp" android:src="@drawable/showrecord_new" /> <scrollview android:id="@+id/scrollview1" android:layout_width="wrap_content" android:layout_height="340dp" android:layout_alignleft="@+id/imageview2" android:layout_alignright="@+id/imageview2" android:layout_aligntop="@+id/imageview2" android:scrollbars="none"> <linearlayout android:id="@+id/linearlayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > </linearlayout> </scrollview> <textview android:id="@+id/textview2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/textview1" android:layout_alignbottom="@+id/textview1" android:layout_torightof="@+id/textview1" android:text="00" android:textcolor="#ffffff" android:textsize="40dp"/> <textview android:id="@+id/textview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/imageview2" android:layout_marginbottom="5dp" android:layout_alignleft="@+id/imageview2" android:text="00:00:00" android:textappearance="?android:attr/textappearancelarge" android:textcolor="#ffffff" android:textsize="60dp" /> </relativelayout>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。
看完文章,还可以扫描下面的二维码下载快手极速版领4元红包
除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。
邀请两个好友奖最高196元,如下图所示:






