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

Android实现APP秒表功能

34资源网2022-09-13340

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

分享给朋友:

相关文章

华盛顿:自己不能胜任的事情,切莫轻易答应别人

华盛顿:自己不能胜任的事情,切莫轻易答应别人

自己不能胜任的事情,切莫轻易答应别人,一旦答应了别人,就必须实践自己的诺言。——华盛顿 这则名言告诉我们什么道理?我们应该怎么做?…

保持好奇心,是改变自己领导方式的方法

保持好奇心,是改变自己领导方式的方法

从理论上来说,做领导的,好奇心是一个基本行为选项。我们尊崇像史蒂夫·乔布斯(Steve Jobs)和托马斯·爱迪生(Thomas Edison)这样的世界级企业领袖,商业期刊也经常赞美好奇心是如何宝贵。但在日常实践中,谁有时间好奇这、好奇那…

视频号加粉多少会被推荐?视频号制作方法分享

视频号加粉多少会被推荐?视频号制作方法分享

今天下午,视频号突然暂停申请,让原本打算在视频号大干一场的运营者们感到懵圈。不过据业内人士透露,此次暂停并“不会太久”,很快就会再次上线。…

联想新手机什么时候上市(联想2021即将上市新款笔记本)

联想新手机什么时候上市(联想2021即将上市新款笔记本)

11月8日,联想中国区手机业务部总经理发布了一则新机预告:摩托罗拉edge X的发布已进入倒计时阶段,在骁龙898处理器即将发布之际预告新机,很大可能预示着首发权已到手。…

田轩:关于发展新型实体企业的几点思考

田轩:关于发展新型实体企业的几点思考

编者按:本文来自田轩的田字格(ID:tianxuanjiaoshou),作者:田轩,创业邦经授权发布,封面图来自摄图网。 在经济增长模式从要素依赖走向创新驱动型高质量发展的关键期,一手拉紧传统实体产业,另一只手紧贴数字经济发展脉络的新型实体…

李佳琦:三十而已

李佳琦:三十而已

编者按:本文转自何加盐(ID:ihejiayan),作者何加盐,题图@李佳琦 微博,创业邦经授权转载。 李佳琦,生于1992年5月。 这是我迄今为止,写过的最年轻的商业人物。 按年份来算,他还要过27天,才进入30岁;按生日来算,他还要再过…