美文网首页AndroidAndroid 开发技术分享技术干货
Android 开屏页倒计时功能实现的详细教程

Android 开屏页倒计时功能实现的详细教程

作者: 程序员K哥 | 来源:发表于2017-06-07 15:32 被阅读3592次

    未经本人授权,不得转载!否则必将维权到底

    最近我司产品提出了一个很常见的需求:App 在开屏页(Splash 界面) 需要加上一个 3s 倒计时按钮,可以选择看 3s 的广告,或者点击按钮跳过广告。

    效果图.jpg
    一、布局实现(使用 FrameLayout 悬浮在广告的右上角,显示倒计时的 TextView 的宽高尽量不要写死,要考虑字体很多的情况!!)
        <FrameLayout
            android:id="@+id/start_skip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true">
    
            <TextView
                android:id="@+id/start_skip_count_down"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/default_padding"
                android:text="@string/click_to_skip"
                android:gravity="center"
                android:background="@drawable/bg_start_page_circle"
                android:textColor="@android:color/white"
                android:textSize="14sp"
                />
        </FrameLayout>
    
    二、TextView 背景的 @drawable/bg_start_page_circle 用系统 shape 实现,不需要 UI 帮我们切图
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
           android:shape="rectangle">
    
        <solid android:color="#80000000"/>
    
        <padding
            android:bottom="3dp"
            android:left="8dp"
            android:right="8dp"
            android:top="3dp"/>
    
        <corners
            android:bottomLeftRadius="45dp"
            android:bottomRightRadius="45dp"
            android:topLeftRadius="45dp"
            android:topRightRadius="45dp"/>
    
    </shape>
    
    三、在 onCreate() 里面找到显示倒计时的 TextView
        private TextView mCountDownTextView;
      /**
         * Created by KeithXiaoY on 2017/06/07.
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            mCountDownTextView = (TextView) findViewById(R.id.start_skip_count_down);
        }
    
    
    四、倒计时实现(使用 Android 系统原生的倒计时控件 CountDownTimer 实现)
        class MyCountDownTimer extends CountDownTimer {
            /**
             * @param millisInFuture
             *      表示以「 毫秒 」为单位倒计时的总数
             *      例如 millisInFuture = 1000 表示1秒
             *
             * @param countDownInterval
             *      表示 间隔 多少微秒 调用一次 onTick()
             *      例如: countDownInterval = 1000 ; 表示每 1000 毫秒调用一次 onTick()
             *
             */
    
            public MyCountDownTimer(long millisInFuture, long countDownInterval) {
                super(millisInFuture, countDownInterval);
            }
    
    
            public void onFinish() {
                mCountDownTextView.setText("0s 跳过");
            }
    
            public void onTick(long millisUntilFinished) {
                mCountDownTextView.setText( millisUntilFinished / 1000 + "s 跳过");
            }
    
        }
    
    
    五、根据具体的业务逻辑完整实现
        private TextView mCountDownTextView;
        private MyCountDownTimer mCountDownTimer;
      /**
         * Created by KeithXiaoY on 2017/06/07.
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            ...
            mCountDownTextView = (TextView) findViewById(R.id.start_skip_count_down);
                //我司需求,在没有 Banner 广告的时候一秒跳过开屏页,有 Banner 广告的时候三秒跳过
            if (PreferencesFactory.getCommonPref().getBoolean(CommonPreferences.PREFS_HAS_START_PAGE_BANNER, false)) {
                mCountDownTextView.setText("3s 跳过");
                //创建倒计时类
                mCountDownTimer = new MyCountDownTimer(3000, 1000);
                mCountDownTimer.start();
                //这是一个 Handler 里面的逻辑是从 Splash 界面跳转到 Main 界面,这里的逻辑每个公司基本上一致
                tmpHandler.postDelayed(runnable, 3000);
            } else {
                mCountDownTextView.setText("1s 跳过");
                mCountDownTimer = new MyCountDownTimer(1000, 1000);
                mCountDownTimer.start();
                tmpHandler.postDelayed(runnable, 1000);
            }
        }
    
    六、注意事项(一定记得在界面销毁的时候将 CountDownTimer 销毁)
        @Override
        protected void onDestroy() {
            if (mCountDownTimer != null) {
                mCountDownTimer.cancel();
            }
            super.onDestroy();
        }
    

    开屏页是一个很使用的小需求,我做这个需求的时候,查阅其他的博客,复制的别人的代码,直接跑不通,还报了个稀奇古怪的 bug ,耽误我好一会儿。所以写下此博客供后人方便,有需要的就取走吧。如果觉得对你有帮助,记得点个赞哦~


    欢迎关注我的微信公众号与我交流,希望与大家共同成长,未来是属于我们的!

    相关文章

      网友评论

      • plus彭于晏:感觉挺好的,比较简单易懂,挺好的
      • Mylovesunshine:点击按钮不用写点击事件跳转吗?
        Mylovesunshine:@keithxiaoy 嗯嗯,明白
        程序员K哥:需要啊,这篇只是写倒计时功能啊,点击事件跳转根据你自己的业务需求自己实现呢。
      • YbSTGing:厉害啊楼主,不需要多高大上,基本小公司足够使用了。收藏!
        程序员K哥:@YbSTGing 谢谢支持:smile:
      • 过期的薯条:这样的一般不是通过动态更新技术完成的吗。
        程序员K哥:@过期的薯条 那就不了解了,一种需求多种实现方式吧:pensive:
        过期的薯条:@KeithXiaoY 我也是上次看到 一个人写动态更新技术,提到的 说像开屏广告这样的 属于动态加载技术。
        程序员K哥:@过期的薯条 如果 app 接的广告联盟是可以直接调它的sdk 实现。热更新也可以实现吗?
      • 903d18a7bd21:先收藏
        程序员K哥:@乐乐诶 这波装的可以吧~
        乐乐诶:我司产品 厉害了团长:+1: :+1:
        程序员K哥:@Xiccc 机智:clap::clap:

      本文标题:Android 开屏页倒计时功能实现的详细教程

      本文链接:https://www.haomeiwen.com/subject/mzzofxtx.html