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

Android实现APP秒表功能

34资源网2022-09-13320

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

分享给朋友:

相关文章

董明珠还需要几个网红?

董明珠还需要几个网红?

编者按:本文来自科技新知,创业邦经授权发布。 作者丨李哩哩 编辑丨月见 一个网红,就是一个渠道。八个网红,就是八个渠道。 董明珠应该进一步向罗永浩看齐。 12月1日,交个朋友直播间发布了名为“交个朋友宇宙”的文章,文章介绍罗永浩“交…

hcie面试通过率是多少(华为hcip认证费用和报名资格)

华为hcie面试通过率是多少? 华为官方公开披露的数据为30%,也就是说十个人中仅有三个可以通过,成为华为专家级网络工程师。从59学习网站长所接触考生的实际情况来看,通过率至少也是五五开,大于50%,因此不必过于担心。 HCIE面试考点涵盖…

语音导出软件哪个好用(免费的语音打包软件推荐)

语音导出软件哪个好用(免费的语音打包软件推荐)

有些QQ用户想把苹果手机或安卓手机QQ语音消息导出到电脑上,如保存为mp3格式文件,方便在电脑上的任意播放器中进行播放,或者想将某人发给自己的一些语音消息串联合并为一个MP3文件。以前手机QQ语音消息是保存在手机上的,但随着QQ版本的升级,…

火了12年,“假洋鬼子”终于翻车了

火了12年,“假洋鬼子”终于翻车了

图源:摄图网 编者按:本文来自微信公众号格隆汇财经热点(ID:glh_finance),作者:万连山,创业邦经授权转载 你肯定看到过这样一幅广告:一个与乔布斯颇有几分相似的神秘洋老头,戴着金丝眼镜,有时叼着烟斗,有时没有,出现在各大高铁站和…

员工收入差距应该大还是小?

员工收入差距应该大还是小?

编者按:本文转自刘润公众号,口述刘润,编辑方雁橙,创业邦经授权转载。 很多创业者或管理者说,我小心翼翼平衡员工工资,尽量照顾业绩差的员工。结果员工离职率反而高了,人才密度降低了,团队的业绩也变差了。 还有一些HR,在招人时会尽量节省成本,薪…