本文承接,Android 开发第五弹:简易时钟(闹钟) 和 Android 开发第六弹:简易时钟(计时器),这一部分是关于秒表的。

布局

同样是新建一个类(StopWatchView)并扩展自LinearLayout,并将其用作布局。

<myapplication.nomasp.com.clock.StopWatchViewandroid : id = "@+id/tabStopWatch"android : layout_width = "match_parent"android : layout_height = "match_parent"android : orientation = "vertical"><LinearLayoutandroid : layout_width = "match_parent"android : layout_height = "wrap_content"android : orientation = "horizontal"><TextViewandroid : id = "@+id/tvHour"android : layout_width = "0dp"android : layout_height = "wrap_content"android : layout_weight = "1"android : textAppearance = "?android:attr/textAppearanceLarge" / ><TextViewandroid : text = ":"android : layout_width = "wrap_content"android : layout_height = "wrap_content"android : textAppearance = "?android:attr/textAppearanceLarge" / ><TextViewandroid : id = "@+id/tvMinute"android : layout_width = "0dp"android : layout_height = "wrap_content"android : layout_weight = "1"android : textAppearance = "?android:attr/textAppearanceLarge" / ><TextViewandroid : text = ":"android : layout_width = "wrap_content"android : layout_height = "wrap_content"android : textAppearance = "?android:attr/textAppearanceLarge" / ><TextViewandroid : id = "@+id/tvSecond"android : layout_width = "0dp"android : layout_height = "wrap_content"android : layout_weight = "1"android : textAppearance = "?android:attr/textAppearanceLarge" / ><TextViewandroid : text = "."android : layout_width = "wrap_content"android : layout_height = "wrap_content"android : textAppearance = "?android:attr/textAppearanceLarge" / ><TextViewandroid : id = "@+id/tvMSceond"android : layout_width = "0dp"android : layout_height = "wrap_content"android : layout_weight = "1"android : textAppearance = "?android:attr/textAppearanceLarge" / >< / LinearLayout><ListViewandroid : id = "@+id/lvWatchTimeList"android : layout_width = "match_parent"android : layout_height = "0dp"android : layout_weight = "1">< / ListView><LinearLayoutandroid : orientation = "horizontal"android : layout_width = "match_parent"android : layout_height = "wrap_content"><Buttonandroid : id = "@+id/btnSWStart"android : layout_width = "0dp"android : layout_height = "wrap_content"android : layout_weight = "1"android : text = "@string/start" / ><Buttonandroid : id = "@+id/btnSWPause"android : layout_width = "0dp"android : layout_height = "wrap_content"android : layout_weight = "1"android : text = "@string/pause" / ><Buttonandroid : id = "@+id/btnSWResume"android : layout_width = "0dp"android : layout_height = "wrap_content"android : layout_weight = "1"android : text = "@string/resume" / ><Buttonandroid : id = "@+id/btnSWRecord"android : layout_width = "0dp"android : layout_height = "wrap_content"android : layout_weight = "1"android : text = "@string/record" / ><Buttonandroid : id = "@+id/btnSWReset"android : layout_width = "0dp"android : layout_height = "wrap_content"android : layout_weight = "1"android : text = "@string/reset" / >< / LinearLayout>
</myapplication.nomasp.com.clock.StopWatchView>

StopWatchView

同样是一开始要定义好的这些balabala的东西:

    private int tenMSecs = 0;private Timer timer = new Timer();private TimerTask timerTask = null;private TimerTask showTimeTask = null;private TextView tvHour, tvMinute, tvSecond, tvMSecond;private Button btnSWStart, btnSWResume, btnSWReset, btnSWPause, btnSWRecord;private ListView lvWatchTimeList;private ArrayAdapter<String> adapter;private static final int MSG_WHAT_SHOW_TIME = 1;public StopWatchView(Context context) {super(context);}public StopWatchView(Context context, AttributeSet attrs) {super(context, attrs);}public StopWatchView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}

看看这些注释,发现和前面两篇的也没有区别啊,我就不废话直接上代码好了。

 @Overrideprotected void onFinishInflate(){super.onFinishInflate();// 为每个相应的TextView控件设置成0tvHour = (TextView)findViewById(R.id.tvHour);tvHour.setText("0");tvMinute = (TextView)findViewById(R.id.tvMinute);tvMinute.setText("0");tvSecond = (TextView)findViewById(R.id.tvSecond);tvSecond.setText("0");tvMSecond = (TextView)findViewById(R.id.tvMSceond);tvMSecond.setText("0");// 为每个Button设置监听事件btnSWRecord = (Button)findViewById(R.id.btnSWRecord);btnSWRecord.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {adapter.insert(String.format("%d:%d:%d.%d",tenMSecs/100/60/60,tenMSecs/100/60%60,tenMSecs/100%60,tenMSecs%100),0);}});btnSWPause = (Button)findViewById(R.id.btnSWPause);btnSWPause.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 停止stopTimer();btnSWPause.setVisibility(View.GONE);btnSWResume.setVisibility(View.VISIBLE);btnSWReset.setVisibility(View.VISIBLE);btnSWRecord.setVisibility(View.GONE);}});btnSWReset = (Button)findViewById(R.id.btnSWReset);btnSWReset.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 停止stopTimer();tenMSecs = 0;adapter.clear();btnSWStart.setVisibility(View.VISIBLE);btnSWPause.setVisibility(View.GONE);btnSWReset.setVisibility(View.GONE);btnSWRecord.setVisibility(View.GONE);btnSWResume.setVisibility(View.GONE);}});btnSWResume = (Button)findViewById(R.id.btnSWResume);btnSWResume.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 开始startTimer();btnSWResume.setVisibility(View.GONE);btnSWReset.setVisibility(View.GONE);btnSWRecord.setVisibility(View.VISIBLE);btnSWPause.setVisibility(View.VISIBLE);}});btnSWStart = (Button)findViewById(R.id.btnSWStart);btnSWStart.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 开始startTimer();btnSWStart.setVisibility(View.GONE);btnSWPause.setVisibility(View.VISIBLE);btnSWRecord.setVisibility(View.VISIBLE);}});btnSWRecord.setVisibility(View.GONE);btnSWPause.setVisibility(View.GONE);btnSWReset.setVisibility(View.GONE);btnSWResume.setVisibility(View.GONE);// 将适配器添加到列表lvWatchTimeList = (ListView)findViewById(R.id.lvWatchTimeList);adapter = new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1);lvWatchTimeList.setAdapter(adapter);// 向Handler发送消息showTimeTask = new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(MSG_WHAT_SHOW_TIME);}};// 开始计时timer.schedule(showTimeTask,200,200);}// 开始private void startTimer(){if(timerTask == null){timerTask = new TimerTask() {@Overridepublic void run() {tenMSecs++;}};timer.schedule(timerTask,10,10);}}// 结束private void stopTimer(){if(timerTask != null){timerTask.cancel();timerTask = null;}}// 取消计时public void onDestory(){timer.cancel();}private Handler handler = new Handler(){public void handleMessage(Message msg){switch (msg.what){// 如果消息匹配,则将相应时间计算后显示在相应TextView上case MSG_WHAT_SHOW_TIME:tvHour.setText(tenMSecs/100/60/60+"");tvMinute.setText(tenMSecs/100/60%60+"");tvSecond.setText(tenMSecs/100%60+"");tvMSecond.setText(tenMSecs%100+"");break;default:break;}};};

结束

好吧,这次是真的结束了。

同样的,需要代码就直接评论留邮箱吧。代码会继续更新的,注释也会继续更新……

项目也上传到Github了,欢迎大家贡献代码啊——传送门 。

Android 开发第七弹:简易时钟(秒表)相关推荐

  1. android 12306反编译,Android开发(七)| “我的12306”实例

    作为程序员,从一无所知开始接触.熟练使用android控件.布局.活动,自己开发的项目随之越来越茁壮,功能越来越完善,我们的内心是由衷感到高兴的. 为了对两个月的学习成果有一个检验,我把之前所学所讲做 ...

  2. 【Android】Android开发启动app弹出一张广告图片,Dialog可以查看大图,查看某个图片功能...

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...

  3. Android 开发第四弹:围住神经猫(简单Demo)

    前言 如下图所示,这篇文章要完成的就是这个简单的示例,后续会继续添加上动画和声音.这里主要包含了游戏的一些简单元素和逻辑. 在我的多次尝试后发现想赢它还是挺难的--毕竟它的走法不是简简单单的Rando ...

  4. Android开发(七)——判断网络状态

    项目中难免会出现使用网络的情况,使用网络前得进行网络判断,看网上的网友一般有多种实现版本. 第一种: // 是否有网络连接public static boolean isNetworkConnecte ...

  5. 时钟电路程序设计c语言,STC89C52单片机简易时钟程序电路设计(附源代码和电路图)...

    51(STC89C52)单片机简易时钟程序电路设计(附源代码和电路图) 上一篇做了一个温湿度采集电路,觉得这东西玩起来还是挺有意思,然后就想做一个时钟,于是就有了下文 1.成品图 51hei图片_20 ...

  6. Android开发入门 - 简易开心消消乐界面设计

    Android开发入门 - 简易开心消消乐界面设计 第一步,点击File->NEW->new module,进入以下界面,选择第一个,即运行在手机和平板电脑上.点击next. 第二步,在第 ...

  7. Android开发简易教程

    Android开发简易教程 Android 开发因为涉及到代码编辑.UI 布局.打包等工序,有一款好用的IDE非常重要.Google 最早提供了基于 Eclipse 的 ADT 作为开发工具,后来在2 ...

  8. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  9. Android开发中EditText获得焦点弹出输入框改变屏幕布局的问题

    在Android开发中,比较头疼的问题就是EditText总是已启动就获得焦点并弹出输入框,感觉很是不爽.而且,因为输入框的弹出,导致屏幕布局获得改变,有些空间被挤压到一起,很是难看,所以,我就上网搜 ...

最新文章

  1. 全面改进Transformer类预训练模型,自然语言任务超越BERT
  2. P6295 有标号 DAG 计数(多项式指数函数对数函数/二项式反演/动态规划/生成函数)
  3. 修改 this 指向
  4. linux中hadoop命令大全,hadoop常用命令
  5. 618期间, “直播带货”翻车负面信息暴增
  6. mysql function_MySQL基础函数——数学函数详解
  7. 外汇EA 指标加密方法
  8. python获取网易云的歌词和时间戳
  9. python制作pdf电子书
  10. 快解析助力服装企业实现ERP远程外网访问
  11. 154. 正则表达式匹配
  12. Chia命令行P图工具
  13. 【C++】加油站加油
  14. TOP100summit:【分享实录】京东1小时送达的诞生之路
  15. UITableViewCell设置行距
  16. 成功人士成功秘诀的调查报告,拥有梦想至关重要
  17. 最近在读的一些文章-2019.04
  18. Nexus 3 Docker仓库(hosted、proxy、group)模式 讲解
  19. Impala优化基本方案
  20. 【敏捷】1.0 待办事项列表

热门文章

  1. 地中海?修电脑的?格子衫?那些对程序员的高级黑!!!
  2. 相约3.8 罗姆EEPROM在线研讨会
  3. 苹果homekit,homeassistant,谷歌等智能生态系统,哪一款更加适合你?
  4. 江南爱软装十大品牌 提升格调的软装种类
  5. 九宫格一条线连起来_9个圆圈用4条线连起来-九个点用四条线连接-数学-霍甲心同学...
  6. Battle Mages (魔法之战,精灵传说)修改器
  7. 古训《增广贤文》补遗
  8. 黑苹果——推荐台式机(翻译自tonymacX86)
  9. 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(10)——天下没有免费午餐定理(No Free Lunch Theorem)
  10. 通信教程 | 概述第一、二、三代CAN总线