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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2022-09-09

Android实现的秒表计时器示例

本文实例讲述了Android实现的秒表计时器.分享给大家供大家参考,具体如下: package com.liu.time; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; imp

Android实现简易秒表功能

本文实例为大家分享了Android实现秒表功能的具体代码,供大家参考,具体内容如下 今天为了给师弟们讲安卓,花了10分钟写了一个简易的秒表app,现贴出代码,供各位刚入门以及还未入门的同学们参考 第一步:布局activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android

Android自定义Chronometer实现短信验证码秒表倒计时功能

本文实例为大家分享了Chronometer实现倒计时功能,Android提供了实现按照秒计时的API,供大家参考,具体内容如下 一.自定义ChronometerView 继续自TextView 主要原理:先设置一个基准倒计时时间mBaseSeconds,内置handler 每隔1s发送一个空消息,mRemainSeconds--,同时刷新界面视图,回调给外部调用者,只到为零.外部调用者可通过start()/pause()/stop()来控制计时器的工作状态. 可以app中发送短信验证码的场景为例

Android实现秒表功能

本文实例为大家分享了Android实现秒表功能的具体代码,供大家参考,具体内容如下 设计完成一个秒表,具备启停功能,正确使用工作线程完成界面刷新 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app

Android 偷拍功能实现(手机关闭依然拍照)详解及实例代码

 Android 偷拍功能/手机关闭能拍照 效果如下: 其实偷拍与偷录实现方式是一样的,都是使用到的WindowManager来绘制桌面小控件的原理.那我就不多说了- 一.首先我们需要一个SurfaceView: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

Android实现记事本功能(26)

本文实例为大家分享了Android实现记事本功能的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.smartnotef.activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.

Android登录注册功能 数据库SQLite验证

本文实例为大家分享了Android登录注册功能的具体代码,供大家参考,具体内容如下 展示效果 代码区 MainActivity(登录方法) public class MainActivity extends AppCompatActivity { @BindView(R.id.editText) EditText editText; @BindView(R.id.editText2) EditText editText2; @BindView(R.id.button) Button button

Android实现搜索功能并本地保存搜索历史记录

本文实例为大家分享了Android实现搜索功能,并且需要显示搜索的历史记录,供大家参考,具体内容如下 效果图: 本案例实现起来很简单,所以可以直接拿来嵌入项目中使用,涉及到的知识点: - 数据库的增删改查操作 - ListView和ScrollView的嵌套冲突解决 - 监听软键盘回车按钮设置为搜索按钮 - 使用TextWatcher( )实时筛选 - 已搜索的关键字再次搜索不重复添加到数据库 - 刚进入页面设置软键盘不因为EditText而自动弹出 代码 RecordSQLiteOpenHel

Android ActionBar搜索功能用法详解

本文实例讲述了Android ActionBar搜索功能用法.分享给大家供大家参考,具体如下: 使用ActionBar SearchView时的注意点: 首先要吐槽一下Android的官方Guide文档 ,关于用法讲得不明确,可能是一直没更新的原因吧. 本来照着文档搞了一下,hint死活出不来,也无法跳转到搜索结果Activity. StackOverflow也有人提出了这个问题,答案说得很明白 - 参考链接. 正确用法 1. 在AndroidManifest.xml中为提供SearchView

Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能

本文实例讲述了Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能.分享给大家供大家参考,具体如下: 前面一篇<Android基于Sensor感应器获取重力感应加速度的方法>我们介绍了sensor的基本知识以及一个使用其中加速度感应器获取数据的例子. 前面提到过一个问题,就是说感应器刷新频率太快,假如我们要做一个UI中,需要根据方向数据绘制一个一个移动的箭头,那么就要太过频繁的刷新绘制界面,占用很多的资源,体验性也会很差,<android 2高级编程>

Android拨打电话功能实例详解

本文实例分析了Android拨打电话功能.分享给大家供大家参考,具体如下: 打电话是手机的一个最基本的功能,现在android智能手机非常流行,里面有多种多样的精彩的手机功能,但是android手机如何实现打电话这个基本功能呢?现以实例说明如下.首先呈上程序: import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; import android.content.Int

Android 编辑头像功能简单实现实例(图片选取,裁剪)

本文介绍了Android 编辑头像功能的简单实例,可以实现拍照,图片选取,裁剪. 拍照 public static void startCamera(Fragment fragment){ File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)+ File.separator+"user_icon.jpg"); Intent intent=new Inten

安卓(Android)实现选择时间功能

前言 由于大部分android初级教程都没教怎么选择时间,初学者碰到这种难免会有些不知所措,难道要让用户自己输入日期时间?先不说用户体验不好,处理用户输入各式各样的日期格式也要花好大一番功夫,下面看看如何实现android选择时间的功能. android 6.0 中的运行效果 TimePickerDialog和DatePickerDialog介绍 系统封装好了两个类可以供我们直接调用,TimepickerDialog用于选择时间,DatePickerDialog用于选择日期. TimePikck

Android返回键功能的实现方法

本文实例讲述了Android返回键功能的实现方法.分享给大家供大家参考.具体如下: 在开发android应用时,常常通过按返回键(即keyCode == KeyEvent.KEYCODE_BACK)就能关闭程序,其实大多情况下并没有关闭改应用 我们可以这样做,当用户点击自定义的退出按钮或返回键时(需要捕获动作),我们在onDestroy()里强制退出应用,或直接杀死进程,具体操作代码如下: public boolean onKeyDown(int keyCode, KeyEvent event)