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

Android实现APP秒表功能

34资源网2022-09-13357

本文实例为大家分享了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

分享给朋友:

相关文章

情浓时,海誓山盟;情淡时,形同陌路

情浓时,海誓山盟;情淡时,形同陌路

1、如果一个人影响到了你的情绪,你的焦点应该放在控制自己的情绪上,而不是影响你情绪的人身上。只有这样,才能真正自信起来。…

分享30句用被刺造句的句子

分享30句用被刺造句的句子

1、黄昏已经谢去,夜幕早已铺开。高高的法国梧桐,被刺眼的白色路灯照亮。在黑色的夜空里镶了一圈又一圈攫绿,有时被拂过的夜风飘动,发出轻轻的沙沙声,只那么一阵,就消失在无限的宁静之中。…

抖音黄v认证有什么好处(抖音流量高的是蓝v和黄v)

抖音黄v认证有什么好处(抖音流量高的是蓝v和黄v)

我将要在这里告诉你们关于抖音号橱窗蓝v抖音小店所有的知识,认真看完。…

背光键盘怎么开灯(有背光和无背光的区别)

背光键盘怎么开灯(有背光和无背光的区别)

机械键盘轴体一直是以樱桃(Cherry)最受大众欢迎,但近几年国产轴体的快速发展,让很多玩家开始享受到更“廉价”的产品。作为国内外设领军者,雷柏自产的雷柏轴已经获得众多游戏爱好者的好评。雷柏同时还有采用经典樱桃轴的产品,笔者最近收到雷柏V8…

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

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

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

怎么用电脑开wifi热点(笔记本电脑连接wifi教程)

很多的时候我们手里不会随时准备着路由器,所以经常会导致手机等移动设备缺乏wifi使用。其实,一根网线、一台Win10笔记本就能轻松设置Wifi共享,并且借助Win10自带的移动Wifi热点就能轻松实现Wifi共享,提供给其他笔记本或手机、平…