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

Android实现APP秒表功能

34资源网2022-09-13488

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

分享给朋友:

相关文章

想去丽江旅游,可是又怕得肺炎,只能手机上看看了

想去丽江旅游,可是又怕得肺炎,只能手机上看看了

最近天天刷抖音刷到丽江的景区,其中看到最多的就是丽江古城,好多导游都会介绍半天时间,那个丽江古城的街道看的我都快“流口水”了,真的太美了,下面给大家看下我用手机截图的一张丽江古城网红打卡点:…

​京东钢镚怎么使用?教你用京东钢镚的支付的方法教程

​京东钢镚怎么使用?教你用京东钢镚的支付的方法教程

京东钢镚怎么使用?很多朋友看到自己的京东钱包里面有京东钢镚,不知道京东钢镚怎么使用,在使用京东钢镚之前,一定要要先了解清楚京东钢镚使用条件有哪些,下面开淘小编来介绍一下京东钢镚怎么使用?如何用你的京东钢镚支付购买商品的方法教程分享。…

汽车中的8848,高合HiPhi X顶配售价高达80万,你会买单吗?

汽车中的8848,高合HiPhi X顶配售价高达80万,你会买单吗?

编者按:本文来自微信公众号银杏科技(ID:yinxingcj),作者:负束,编辑:白望,创业邦经授权转载 2015年9月丁磊加入乐视,担任乐视超级汽车联合创始人、法拉第未来全球CEO。 当时丁磊一定没想到,乐视很快就会陷入了资金链断裂,贾跃…

第二家东南亚美股上市公司诞生,Grab为何上市即大跌?

第二家东南亚美股上市公司诞生,Grab为何上市即大跌?

编者按:本文来自微信公众号美股研究社(ID:meigushe),创业邦经授权转载 在很长一段时间内,来自新加坡、发家于东南亚市场的Sea(冬海集团)都被外界称为造富神话。并非因为其“东南亚小腾讯”的影子,而是其强大的游戏和电商业务支撑它制霸…

首页页眉怎么去掉横线(教你三招快速处理)

首页页眉怎么去掉横线(教你三招快速处理)

Word可以说是office里算简单的了,不管是谁都能比较好的使用Word,但是要用好Word也不是那么容易的。所以今天介绍的这几个Word小技巧也是十分实用的,快来学起来吧! 字符加圈圈 一 很多时候,我们在编号的时候总会用到这个带圈字…

迷你世界在线玩免费(迷你世界不用实名认证)

迷你世界在线玩免费(迷你世界不用实名认证)

迷你世界官方最新版本是一款卡通像素风格的沙盒冒险类手机游戏,采用的是经典像素方块的画风,在这里,玩家只需使用游戏账号进行登录,进入游戏后就可以免费获取新手专属福利,告别了人数过多造成的网络卡顿,让你畅玩不停。游戏的操作也是非常的简单,左边是…