Android 实现倒计时的简单方式

举报
程思扬 发表于 2022/01/13 22:45:39 2022/01/13
【摘要】 一、布局实现(使用 FrameLayout 悬浮在广告的右上角,显示倒计时的 TextView 的宽高尽量不要写死,要考虑字体很多的情况!!) <FrameLayout android:id="@+id/start_skip" android:layout_...

一、布局实现(使用 FrameLayout 悬浮在广告的右上角,显示倒计时的 TextView 的宽高尽量不要写死,要考虑字体很多的情况!!)

     
  1. <FrameLayout
  2. android:id="@+id/start_skip"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:layout_alignParentRight="true"
  6. android:layout_alignParentTop="true">
  7. <TextView
  8. android:id="@+id/start_skip_count_down"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:layout_margin="@dimen/default_padding"
  12. android:text="@string/click_to_skip"
  13. android:gravity="center"
  14. android:background="@drawable/bg_start_page_circle"
  15. android:textColor="@android:color/white"
  16. android:textSize="14sp"
  17. />
  18. </FrameLayout>
二、TextView 背景的 @drawable/bg_start_page_circle 用系统 shape 实现,不需要 UI 帮我们切图

     
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shape="rectangle">
  4. <solid android:color="#80000000"/>
  5. <padding
  6. android:bottom="3dp"
  7. android:left="8dp"
  8. android:right="8dp"
  9. android:top="3dp"/>
  10. <corners
  11. android:bottomLeftRadius="45dp"
  12. android:bottomRightRadius="45dp"
  13. android:topLeftRadius="45dp"
  14. android:topRightRadius="45dp"/>
  15. </shape>
三、在 onCreate() 里面找到显示倒计时的 TextView

     
  1. private TextView mCountDownTextView;
  2. /**
  3. * Created by KeithXiaoY on 2017/06/07.
  4. */
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. mCountDownTextView = (TextView) findViewById(R.id.start_skip_count_down);
四、倒计时实现(使用 Android 系统原生的倒计时控件 CountDownTimer 实现)

     
  1. class MyCountDownTimer extends CountDownTimer {
  2. /**
  3. * @param millisInFuture
  4. * 表示以「 毫秒 」为单位倒计时的总数
  5. * 例如 millisInFuture = 1000 表示1秒
  6. *
  7. * @param countDownInterval
  8. * 表示 间隔 多少微秒 调用一次 onTick()
  9. * 例如: countDownInterval = 1000 ; 表示每 1000 毫秒调用一次 onTick()
  10. *
  11. */
  12. public MyCountDownTimer(long millisInFuture, long countDownInterval) {
  13. super(millisInFuture, countDownInterval);
  14. }
  15. public void onFinish() {
  16. mCountDownTextView.setText("0s 跳过");
  17. }
  18. public void onTick(long millisUntilFinished) {
  19. mCountDownTextView.setText( millisUntilFinished / 1000 + "s 跳过");
  20. }
  21. }
五、根据具体的业务逻辑完整实现

     
  1. private TextView mCountDownTextView;
  2. private MyCountDownTimer mCountDownTimer;
  3. /**
  4. * Created by KeithXiaoY on 2017/06/07.
  5. */
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. ...
  9. mCountDownTextView = (TextView) findViewById(R.id.start_skip_count_down);
  10. //我司需求,在没有 Banner 广告的时候一秒跳过开屏页,有 Banner 广告的时候三秒跳过
  11. if (PreferencesFactory.getCommonPref().getBoolean(CommonPreferences.PREFS_HAS_START_PAGE_BANNER, false)) {
  12. mCountDownTextView.setText("3s 跳过");
  13. //创建倒计时类
  14. mCountDownTimer = new MyCountDownTimer(3000, 1000);
  15. mCountDownTimer.start();
  16. //这是一个 Handler 里面的逻辑是从 Splash 界面跳转到 Main 界面,这里的逻辑每个公司基本上一致
  17. tmpHandler.postDelayed(runnable, 3000);
  18. } else {
  19. mCountDownTextView.setText("1s 跳过");
  20. mCountDownTimer = new MyCountDownTimer(1000, 1000);
  21. mCountDownTimer.start();
  22. tmpHandler.postDelayed(runnable, 1000);
  23. }
六、注意事项(一定记得在界面销毁的时候将 CountDownTimer 销毁)

     
  1. @Override
  2. protected void onDestroy() {
  3. if (mCountDownTimer != null) {
  4. mCountDownTimer.cancel();
  5. }
  6. super.onDestroy();
  7. }

文章来源: chengsy.blog.csdn.net,作者:程思扬,版权归原作者所有,如需转载,请联系作者。

原文链接:chengsy.blog.csdn.net/article/details/80648689

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。