[文章]HarmonyOS实战——TickTimer定时器组件基本使用

阅读量0
0
1
1. TickTimer定时器组件说明:
  • 是Text的子类,所以可以使用Text的一些属性
  • 该组件目前有一些bug,后续版本中会修复这些bug的
常见属性:
属性名功能说明
format设置显示的格式
count_downtrue倒着计时,false正着计时
常见方法:
基本用法:
  • xml文件:
  1. <TickTimer
  2.         ohos:id="$+id:my_tt"
  3.         ohos:height="60vp"
  4.         ohos:width="250vp"
  5.         ohos:padding="10vp"
  6.         ohos:text_size="20fp"
  7.         ohos:text_color="#ffffff"
  8.         ohos:background_element="#0000ff"
  9.         ohos:text_alignment="center"
  10.         ohos:layout_alignment="horizontal_center"
  11.         ohos:top_margin="50vp" />
  12.         //没有设置时间,默认是从1970年1月1日开始。
复制代码

  • mm:ss 分别表示分钟和秒钟

2. 实现案例——计时器
  • 统计一段时间之类做了多少事情,这个时候就需要计时器了
  • 在定时器下面分别添加开始和结束计时的两个按钮
  • 新建项目:TickTimerApplication

ability_main
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <DirectionalLayout
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4.     ohos:height="match_parent"
  5.     ohos:width="match_parent"
  6.     ohos:alignment="center"
  7.     ohos:orientation="vertical">

  8.     <TickTimer
  9.         ohos:id="$+id:ticktimer"
  10.         ohos:height="match_content"
  11.         ohos:width="match_content"
  12.         ohos:text_size="30fp"
  13.         ohos:text_color="#FFFFFF"
  14.         ohos:background_element="#0000FF"
  15.         ohos:text_alignment="center"
  16.         ohos:layout_alignment="center"
  17.         />

  18.     <Button
  19.         ohos:id="$+id:start"
  20.         ohos:height="match_content"
  21.         ohos:width="match_content"
  22.         ohos:text="开始"
  23.         ohos:text_size="30fp"
  24.         ohos:text_color="#FFFFFF"
  25.         ohos:background_element="#666600"
  26.         ohos:text_alignment="center"
  27.         ohos:layout_alignment="center"
  28.         ohos:top_margin="30vp"
  29.         />

  30.     <Button
  31.         ohos:id="$+id:end"
  32.         ohos:height="match_content"
  33.         ohos:width="match_content"
  34.         ohos:text="结束"
  35.         ohos:text_size="30fp"
  36.         ohos:text_color="#FFFFFF"
  37.         ohos:background_element="#666600"
  38.         ohos:text_alignment="center"
  39.         ohos:layout_alignment="center"
  40.         ohos:top_margin="30vp"
  41.         />

  42. </DirectionalLayout>
复制代码

  • ohos:text_alignment="center":表示的是文本相对于组件是居中的
  • ohos:layout_alignment="center":表示的是TickTimer组件在布局里面是居中的
MainAbilitySlice
  1. package com.xdr630.ticktimerapplication.slice;

  2. import com.xdr630.ticktimerapplication.ResourceTable;
  3. import ohos.aafwk.ability.AbilitySlice;
  4. import ohos.aafwk.content.Intent;
  5. import ohos.agp.components.Button;
  6. import ohos.agp.components.Component;
  7. import ohos.agp.components.TickTimer;

  8. public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {

  9.     TickTimer tickTimer;
  10.     Button start;
  11.     Button end;

  12.     @Override
  13.     public void onStart(Intent intent) {
  14.         super.onStart(intent);
  15.         super.setUIContent(ResourceTable.Layout_ability_main);

  16.         //1.找到定时器组件
  17.         tickTimer = (TickTimer) findComponentById(ResourceTable.Id_ticktimer);
  18.         //找到开始和结束两个按钮组件
  19.         start = (Button) findComponentById(ResourceTable.Id_start);
  20.         end = (Button) findComponentById(ResourceTable.Id_end);

  21.         //2.给开始和结束按钮绑定单击事件
  22.         start.setClickedListener(this);
  23.         end.setClickedListener(this);

  24.         //3.给定时器做一些基本设置
  25.         //false:正向计时 0 1 2 3 4 ...
  26.         //true:反向计时 10 9 8 7 6 ...
  27.         tickTimer.setCountDown(false);

  28.         //设置一下计时的格式
  29.         tickTimer.setFormat("mm:ss ");
  30.     }

  31.     @Override
  32.     public void onActive() {
  33.         super.onActive();
  34.     }

  35.     @Override
  36.     public void onForeground(Intent intent) {
  37.         super.onForeground(intent);
  38.     }

  39.     @Override
  40.     //参数表示点击的按钮对象
  41.     public void onClick(Component component) {
  42.         if (component == start){
  43.             //开启定时
  44.             tickTimer.start();
  45.         }else if (component == end){
  46.             //结束计时
  47.             tickTimer.stop();
  48.         }
  49.     }
  50. }
复制代码

  • 运行:

  • 点击“开始”按钮

  • 点击“结束”按钮后就停止计时了

3. TickTimer组件——bug汇总:
  • 不要用 setBaseTimer 去设置基准时间
  • 停止之后不用重新开始
  • 如果没有设置基准时间,把时间格式设置如下,就会看到是从什么时候开始计时的了
  • 运行,发现是从时间原点开始
  • 所以,如果没有设置基准时间,默认是从时间原点开始计时的
  • 如果设置了基准时间,参数为 0
  • 运行:
  • 点击“开始”按钮后,瞬间变成了当前的时间开始计时
  • 所以,如果设置了基准时间,参数为 0,是从当前时间开始计时的
  • 如果设置了基准时间,参数为非 0 ,具体数值:3600*1000(表示一小时的毫秒值)
  • 运行,点击“开始”按钮后,并没有对当前时间做一个增加,反而对当前时间做一个减少
  • 所以,如果设置了基准时间,参数为非 0,也是从当前时间开始计时的,并且还会减少对应增加的时间,说明有 bug
总结:
  • 如果没有设置基准时间,默认是从时间原点开始计时的
  • 如果设置基准时间,参数为0,是从当前时间开始计时的
  • 如果设置基准时间,参数为非0,也是从当前时间开始计时的
  • 所以,tickTimer.setBaseTime(); 这个方法是有 bug 的,暂时不要用这个方法,相信以后HarmonyOS在更新的时候会修复这个 bug
  • 还有一个 bug,把时间格式设置为分秒计时
  • 运行后,它不是从 0 秒开始计时的,而是从运行开始项目后就开始了,当你点击“开始”按钮后,就会发现已经开始计时了,按下结束再开始,也不是从刚刚暂停的时间再开始计时的,而是一直往后面计时
  • 虽然点击了结束,在这个APP界面当中时间不再跳动,但是在系统的底层,时间并没有停止

建议:
  • 该组件目前还是有 bug 的
  • 计时器一旦点击结束之后,就不要重新开始再计时了,也就是说每个计时器只用一次就行了
4. TickTimer定时器案例——统计10秒内按钮点击的次数
  • 使用定时器统计10秒之内按了多少次?
需求:
  • 最上面是TickTimer定时器,中间的是文本显示次数,下面是“开始计时”按钮,当点击了这个按钮之后,按钮上面的文字就会变成“请疯狂点我”,然后就不断的点击这个按钮,点击一次,上面显示的文本就会增加一次计数,此时,定时器也会不断走动的状态,当到达10秒钟之后,“请疯狂点我”按钮里面的文字就会显示“游戏结束了”,中间的按钮就会展示我在 10秒之内一共点击了多少按钮次数

  • 新建项目:TickTimerPracticeApplication

ability_main
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <DirectionalLayout
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4.     ohos:height="match_parent"
  5.     ohos:width="match_parent"
  6.     ohos:alignment="center"
  7.     ohos:orientation="vertical">

  8.     <TickTimer
  9.         ohos:id="$+id:ticktimer"
  10.         ohos:height="match_content"
  11.         ohos:width="match_content"
  12.         ohos:text_size="30fp"
  13.         ohos:text_color="#FFFFFF"
  14.         ohos:background_element="#0000FF"
  15.         ohos:text_alignment="center"
  16.         ohos:layout_alignment="center"
  17.         />

  18.     <Text
  19.         ohos:id="$+id:count"
  20.         ohos:height="match_content"
  21.         ohos:width="match_content"
  22.         ohos:top_margin="10vp"
  23.         ohos:text="0次"
  24.         ohos:text_size="30fp"
  25.         />

  26.     <Button
  27.         ohos:id="$+id:but"
  28.         ohos:height="match_content"
  29.         ohos:width="match_content"
  30.         ohos:top_margin="10vp"
  31.         ohos:text_size="30fp"
  32.         ohos:text="开始计时"
  33.         ohos:background_element="#FF0000"
  34.         />



  35. </DirectionalLayout>
复制代码

  • 定时器的格式:00:01 ,可以用 ticktimer.setText(); 获取到定时器现在的时间,不过现在是字符串的表示,如:“00:01”,所以还需要把它变为毫秒值
  • 添加一个方法进行转换

MainAbilitySlice
  1. package com.xdr630.ticktimerpracticeapplication.slice;

  2. import com.xdr630.ticktimerpracticeapplication.ResourceTable;
  3. import ohos.aafwk.ability.AbilitySlice;
  4. import ohos.aafwk.content.Intent;
  5. import ohos.agp.components.Button;
  6. import ohos.agp.components.Component;
  7. import ohos.agp.components.Text;
  8. import ohos.agp.components.TickTimer;

  9. import java.text.ParseException;
  10. import java.text.SimpleDateFormat;
  11. import java.util.Date;

  12. public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener, TickTimer.TickListener {

  13.         TickTimer ticktimer;
  14.         Text text;
  15.         Button but;

  16.     @Override
  17.     public void onStart(Intent intent) {
  18.         super.onStart(intent);
  19.         super.setUIContent(ResourceTable.Layout_ability_main);

  20.         //1.找到三个组件对象
  21.         ticktimer = (TickTimer) findComponentById(ResourceTable.Id_ticktimer);
  22.         text = (Text) findComponentById(ResourceTable.Id_count);
  23.         but = (Button) findComponentById(ResourceTable.Id_but);

  24.         //2.给按钮绑定单击事件
  25.         but.setClickedListener(this);

  26.         //3.给定时器做一些基本设置
  27.         //false:正向计时 1 2 3 4 ...
  28.         //true:反向计时 10 9 8 7 ...
  29.         ticktimer.setCountDown(false);

  30.         //设置计时格式
  31.         ticktimer.setFormat("mm:ss");

  32.         //4.给定时器绑定定时事件
  33.         ticktimer.setTickListener(this);
  34.     }

  35.     @Override
  36.     public void onActive() {
  37.         super.onActive();
  38.     }

  39.     @Override
  40.     public void onForeground(Intent intent) {
  41.         super.onForeground(intent);
  42.     }


  43.     //判断是否是第一次被点击
  44.     //true:表示第一次被点击
  45.     //false,表示不是第一次被点击
  46.     boolean first = true;

  47.     //定义一个变量用了统计点击的次数
  48.     int count = 0;

  49.     //记录游戏开始的时间
  50.     long startTime = 0;

  51.     @Override
  52.     public void onClick(Component component) {
  53.         //当该方法被调用,证明按钮被点击了一次
  54.         count++;

  55.         //判断当前是否是第一次被点击
  56.         if (first){
  57.             //第一次点击了
  58.             //记录游戏开始的时间
  59.             //要获取定时器现在的时间
  60.             //ticktimer.getText();//”00:01“
  61.             startTime = StringToLong(ticktimer.getText());
  62.             //修改按钮里面的文本内容
  63.             but.setText("请疯狂点我");
  64.             //修改标记
  65.             first = false;
  66.             //开启定时器
  67.             ticktimer.start();
  68.         }
  69.         //如果不是第一次点击
  70.         //那么就不需要做上面的事情,直接修改文本的内容就可以了
  71.         text.setText(count + "次");
  72.     }

  73.     //当定时器开始计时的时候,就会不断去调用onTickTimerUpdate这个方法
  74.     //tickTimer表示计时器的对象
  75.     @Override
  76.     public void onTickTimerUpdate(TickTimer tickTimer) {
  77.         //1.获取当前定时器的时间,并把时间变为毫秒值
  78.         long nowTime = StringToLong(tickTimer.getText());
  79.         //2.判断nowTime跟startTime之间的差有没有超过10秒
  80.         if ((nowTime - startTime) >= 10000){
  81.             tickTimer.stop();
  82.             text.setText("最终成绩为:" + count + "次");
  83.             but.setText("游戏结束了");
  84.             //取消按钮的点击事件
  85.             but.setClickable(false);
  86.         }
  87.     }

  88.     //作用:把字符串类型的时间变成毫秒值(long)
  89.     public long StringToLong(String time) {
  90.         SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
  91.         Date  date = null;
  92.         try {
  93.             date = sdf.parse(time);
  94.         } catch (ParseException e) {
  95.             e.printStackTrace();
  96.         }
  97.         long result = date.getTime();
  98.         return result;
  99.     }
  100. }

复制代码


  • 运行:


回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友