当前位置:首页 > 谈天说地

Android实现APP秒表功能

34资源网2022-09-13427

本文实例为大家分享了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元,如下图所示:

快手极速版邀请好友奖励

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/22065.html

分享给朋友:

相关文章

虚拟内存太低怎么设置(电脑磁盘空间不足清理步骤)

虚拟内存太低怎么设置(电脑磁盘空间不足清理步骤)

在电脑的平时使用中,经常会出现内存不足的提示,有时可能小伙伴们会疑惑了,明明自己是16G内存的性能为何也能出现这种提示呢?这是当你在运行多个大程序的时候,对内存的需求非常大,当物理内存不能满足需求时,有可能导致程序关闭而数据保存错误。那么在…

融资丨「奕斯伟计算」完成25亿元C轮融资,目标物联网芯片领域全球领导者

融资丨「奕斯伟计算」完成25亿元C轮融资,目标物联网芯片领域全球领导者

创业邦获悉,12月1日,AIoT芯片与解决方案提供商北京奕斯伟计算技术有限公司(以下简称:奕斯伟计算)宣布完成25亿元人民币C轮融资,由金石投资和中国互联网投资基金联合领投,尚颀投资、国开科创、华新投资等跟投,老股东 IDG、君联资本、刘益…

这家带有ESG基因的SaaS公司,如何定义未来的服装行业?

这家带有ESG基因的SaaS公司,如何定义未来的服装行业?

编者按:本文转自GGV纪源资本,创业邦经授权转载。 随着新一轮科技革命和产业变革,服装行业进行数智化转型升级已经成为了行业共识,但是多数企业对服装智能制造转型升级系统性认识不足,传统大批量流水线的生产方式无法满足市场“多款式”、“小批量”、…

pdf如何转成图片格式(教你简单免费的方法)

pdf如何转成图片格式(教你简单免费的方法)

现在的pdf应用得很广泛,由于它可以不依赖操作系统的语言和字体及显示设备,阅读起来很方便。我们在工作中几乎每天都会使用到PDF文件,有时候我们需要将PDF文件导出成图片格式的文件,这样更方便我们使用。那么问题来了,pdf如何变成图片格式呢?…

诺基亚c2-01手机参数(诺基亚最新款手机)

诺基亚c2-01手机参数(诺基亚最新款手机)

诺基亚C2 Android Go Edition 价格:暂无价格 上市时间:2020年03月 屏幕尺寸:5.7英寸 分辨率:1520×720 触摸屏类型:电容触摸屏,多点触控CPU型号:紫光展锐SC9832E CPU核数:四核 操作系统:…