Android实现APP秒表功能
更新时间:2022年09月11日 10:15:30 作者:HOcom
这篇文章主要为大家详细介绍了Android实现APP秒表功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud)
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun)
本文实例为大家分享了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="http://9i0i.com/pic.php?p=@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="http://9i0i.com/pic.php?p=@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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。
相关文章
Android实现简易计步器功能隔天步数清零查看历史运动纪录
这篇文章主要介绍了Android实现简易计步器功能隔天步数清零查看历史运动纪录,需要的朋友可以参考下2017-06-06android JSON解析数据 android解析天气预报
这篇文章主要为大家详细介绍了android JSON解析数据,android天气预报JSON数据解析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-03-03
最新评论