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>

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

(0)

相关推荐

  • 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自定义Chronometer实现短信验证码秒表倒计时功能

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

  • Android实现简易秒表功能

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

  • 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实现APP秒表功能

    本文实例为大家分享了Android实现APP秒表功能的具体代码,供大家参考,具体内容如下 这几天一直在看安卓,也正好赶上老师布置的作业,所以就做了一个秒表.自己参考了一下别人的图标,有了一些灵感所以顺便也设计了一下界面.下面先贴一下秒表的界面: 打开秒表后的第一个界面 点击开始计时,开始键变为暂停,记录和停止开始变实: 点击记录: 记录满了之后自动上移,通过滑动可以查看前面的: 点击暂停: 停止: 重新开始和记录: 双击返回键退出: 下面贴出Activity的代码: package com.ex

  • Android开发微信APP支付功能的要点小结

    基本概念 包名值得是你APP的包,在创建工程时候设置的,需要在微信支付平台上面设置. 签名指的是你生成APK时候所用的签名文件的md5,去掉:全部小写,需要在微信支付平台上面设置. 调试阶段,签名文件可以使用调试用的debug.keystore,签名可以直接在eclipse上面查看,或者用工具查看 ,安装打开输入包名即可查看. 发布的时候一定需要在微信支付平台上面设置成发布用的签名值. 官方的Demo里面的内容并不是全是必须的,甚至只需要有libammsdk.jar就够了,AndroidMani

  • Android实现APP自动更新功能

    现在一般的android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新.该小程序实现的就是这个功能. 该小程序的特点是,当有更新时,会弹出一个提示框,点击确定,则在通知来创建一个进度条进行下载,点击取消,则取消更新. 以下是详细代码: 1.创建布局文件notification_item.xml,用于在通知栏生成一个进度条和下载图标. <?xml version="1.0" encoding="utf-8"?>

  • Android实现app分享文件到微信功能

    本文实例为大家分享了Android实现app分享文件到微信的具体代码,供大家参考,具体内容如下 两种实现方案: 1.使用WXFileObject构造分享方法发送到微信: 2.调用系统分享方法,把文件直接发送到微信: 那么下面来分别看看怎么实现: 0.准备工作 首先,需要在AndroidManifest.xml中配置FileProvider信息,以适配10以后版本文件读取问题 AndroidManifest.xml <provider android:name="androidx.core.

  • Android实现app开机自启动功能

    本文实例为大家分享了Android实现app开机自启动的具体代码,供大家参考,具体内容如下 最近要做个大屏的开发板程序,需要长期稳定运行,并开机自启运行此软件. 废话不多说,上代码 开机自启需要广播检测,权限 android.permission.RECEIVE_BOOT_COMPLETED 1.AndroidManifest.xml中加入两行代码,红色代码 <?xml version="1.0" encoding="utf-8"?> <manif

  • Android Camera开发手电筒功能

    这是一个简单的运用Android Camera开发手电筒功能,AndroidManifest.xml文件的入口是startapp,这个文件没上传上来,大家可以自己写. flashlight.java package com.android.app; import android.app.Activity; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.os.Bun

  • Android判断App前台运行还是后台运行(运行状态)

    本文通过图文并茂的方式给大家介绍android判断app状态的相关内容,具体详情如下所示: 要了解这块,首先需要明白一些概念,app,process,task 1.process就是进程,是linux的概念. 2.一般一个app拥有一个uid,运行在一个进程里,如果app中给service等定义不同的uid,那Service就运行在另外一个进程里,也就是说uid就相当于进程的id一样,一个uid就代表一个进程:也可以几个app定义一个uid,那他们就运行在一个进程里了. 3.task是andro

  • Android中Listview点赞功能的实现

    最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路. 基本思路: 进入界面–>获取数据–> 在Listview中显示–> 通过map集合(position,boolean)保存每一行是否被点击–> 利用实体类去保存相应的对象–> get/set方法进行相应值得改变–> 点击一次,相应的数量加1 只实现了点赞功能,踩和赞基本类似. 具体实现如下: 继承自BaseAdapter package com.gz.test_listv

随机推荐