精华内容
下载资源
问答
  • 倒计时按钮

    2015-12-22 11:28:11
    倒计时按钮,android开发.
  • 实现IOS倒计时按钮

    2021-04-04 15:27:52
    这个案例源码可以支持实现IOS倒计时按钮,源码JKCountDownButton,JKCountDownButton,子类化UIButton实现IOS倒计时按钮,常常用于注册等发送验证码的时候进行倒计时操作。
  • JKCountDownButton倒计时按钮
  • iOS 倒计时按钮

    2016-04-29 12:00:02
    ios倒计时按钮,通常获取短信需要倒计时,可以直接用,也可以结合自己的按钮使用,好用不多说。
  • 主要为大家详细介绍了Android自定义倒计时按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 我在项目中也遇到这样的功能,特别在忘记密码的界面,我注意到一点:当发送验证码之后,要60秒之后才能再发,如果退出界面,...倒计时按钮点击:发送验证码 发送验证码成功:禁用按钮 & 倒计时开始 倒计时结束...

    验证码按钮在项目的使用频率应该是100%,现在大多数应用都会采用手机号码登陆,通常都会支持发送验证码登陆的功能。

    我在项目中也遇到这样的功能,特别在忘记密码的界面,我注意到一点:当发送验证码之后,要60秒之后才能再发,如果退出界面,重新进入同样需要等待时间结束。

    其中分析一下流程应该是这样的:

    1. 倒计时按钮点击:发送验证码
    2. 发送验证码成功:禁用按钮 & 倒计时开始
    3. 倒计时结束之后:恢复按钮

    针对这种场景进行分析,如果采用继承Button的方式对项目耦合性太强了,以后不需要移除也特别麻烦。所以抽象一个工具类进行对Button自动化设置会更好,以后不需要了可以随时移除然后重新实现逻辑。

    既然是倒计时功能,所以项目需要使用到相关的技术,在安卓开发中,我总结了如下几种倒计时方法:

    1. Handler实现倒计时(sendEmptyMessageDelayed方法)
    2. Thread实现倒计时
    3. View.postDelayed()实现倒计时
    4. CountDownTimer实现倒计时

    CountDownTimer是安卓专门未倒计时设计的一个类,使用起来也非常方便,所以我也选择它作为实现的基础。他是一个抽象类,使用时需要继承并实现onTick()和onFinish()方法。

    /**
     * 构造函数(millisInFuture:倒计时总时间,countDownInterval:触发回调的时间间隔)
     */
    public CountDownTimer(long millisInFuture, long countDownInterval)
    
    /**
     * 每次倒计时都会触发回调,millisUntilFinished表示剩余的时间。
     */
    public abstract void onTick(long millisUntilFinished);
    
    /**
     * 倒计时结束后回调
     */
    public abstract void onFinish();


    再想想自己设计这个工具类的具体思想:

    1. autoHandleWhenActivityCreate(Button indicator) :在onCreate()中调用,绑定按钮并初始化。
    2. autoHandleWhenActivityDestroy() :在onDestroy()中调用,因为CountDownTimer本质上是Handler实现的,所以处理不当会造成内存泄漏。
    3. autoHandleRequestStartTimer() :调用此方法会立即开始倒计时,按钮的倒计时文字将会变化。

    贴一贴工具类的具体使用方法:

    public class ForgetActivity extends AppCompatActivity {
        Button uaSendCode;
    
        // 第一步:创建静态计时器类(当前界面有效,重复进入倒计时依然继续)
        private static CountDownTimer mCountDown = new CountDownTimer(60, "发送验证码(%s)", "发送验证码", R.drawable.register_bg_send, R.drawable.register_bg_unsend);
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.forget_activity_main);
    
            uaSendCode = findViewById(R.id.uaSendCode);
    
            // 第二步:绑定按钮
            mCountDown.autoHandleWhenActivityCreate(uaSendCode);
            
            
            uaSendCode.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 注意:启动计时器需要调用下面的方法
                    mCountDown.autoHandleRequestStartTimer();
                }
            });
        }
        
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            //第三步:释放内部引用,防止内存泄漏
            mCountDown.autoHandleWhenActivityDestroy();
        }
    }


    下面贴上具体实现的逻辑:

    package com.anbang.family.library;
    
    import android.view.View;
    import android.widget.Button;
    
    /**
     * 按钮倒计时
     */
    public class CountDownTimer extends android.os.CountDownTimer {
    
        private Button mIndicator;
        private String mCountDownFormatString = "发送验证码(%s)";
        private String mCountDownFinishString = "发送验证码";
        private int mEnableDrawable;
        private int mUnableDrawable;
    
        private int mSecond;
        private int mCount;
    
        /**
         * 是否启动过计时器(mCount一开始不为0,所以配合这个标志做判断是否start计时器)
         */
        private boolean mAlreadyStart = false;
    
        public CountDownTimer(int second, String countDownFormatString, String countDownFinishString, int enableDrawable, int unableDrawable) {
            super((second <= 0 ? 60 : second) * 1000, 1000);
            this.mSecond = second;
            this.mCount = second;
            this.mCountDownFormatString = countDownFormatString;
            this.mCountDownFinishString = countDownFinishString;
            this.mEnableDrawable = enableDrawable;
            this.mUnableDrawable = unableDrawable;
        }
    
        public int getmCount() {
            return mCount;
        }
    
        public void autoHandleWhenActivityCreate(Button indicator) {
            this.mIndicator = indicator;
    
            if (mCount <= 0 || !mAlreadyStart) {
                mIndicator.setEnabled(true);
                mIndicator.setText(mCountDownFinishString);
                mIndicator.setBackgroundResource(mEnableDrawable);
            } else {
                mIndicator.setEnabled(false);
                mIndicator.setBackgroundResource(mUnableDrawable);
                mIndicator.setText(String.format(mCountDownFormatString, mCount));
            }
        }
    
        public void autoHandleWhenActivityDestroy() {
            mIndicator = null;
        }
    
        public void autoHandleRequestStartTimer() {
            if (mCount <= 0 || !mAlreadyStart) {
                mAlreadyStart = true;
                mCount = mSecond <= 0 ? 60 : mSecond;
                if (mIndicator != null) {
                    unableIndicator(mCount);
                }
                start();
            }
        }
    
        @Override
        public void onTick(long millisUntilFinished) {
            mCount--;
            unableIndicator((int) (millisUntilFinished / 1000));
        }
    
        @Override
        public void onFinish() {
            enableIndicator();
        }
    
        private void unableIndicator(int second) {
            if (mIndicator != null) {
                mIndicator.setEnabled(false);
                mIndicator.setBackgroundResource(mUnableDrawable);
                mIndicator.setText(String.format(mCountDownFormatString, second));
            }
        }
    
        private void enableIndicator() {
            if (mIndicator != null) {
                mIndicator.setEnabled(true);
                mIndicator.setText(mCountDownFinishString);
                mIndicator.setBackgroundResource(mEnableDrawable);
            }
        }
    }

    转载于:https://www.cnblogs.com/nicojerry/p/10350409.html

    展开全文
  • iOS 倒计时按钮 JKCountDownButton ,JKCountDownButton,子类化UIButton实现IOS倒计时按钮,常常用于注册等发送验...
  • 实现倒计时按钮

    2020-09-05 10:35:38
    实现倒计时按钮,例如:发送短信之后有60s的倒计时不能点击按钮。

    实现如发送短信验证码等功能,通常需要倒计时功能,防止用户频繁按按钮发送短信。
    效果如同:
    在这里插入图片描述
    主要通过下面帮助类实现:

    import android.os.CountDownTimer;
    import android.widget.Button;
    
    /**
     * 倒计时Button帮助类
     * 用法
     * CountDownButtonHelper countDownButtonHelper = new CountDownButtonHelper(smsBtn);
     * countDownButtonHelper.start();//开始
     * ----------------
     * countDownButtonHelper.cancel();//取消
     */
    public class CountDownButtonHelper {
        // 倒计时timer
        private CountDownTimer countDownTimer;
        // 计时结束的回调接口
        private OnFinishListener listener;
    
        private Button mButton;
        private String btnText;
    
        /**
         * @param button 需要显示倒计时的Button
         */
        public CountDownButtonHelper(Button button) {
            this.mButton = button;
            // 由于CountDownTimer并不是准确计时,在onTick方法调用的时候,time会有1-10ms左右的误差,这会导致最后一秒不会调用onTick()
            // 因此,设置间隔的时候,默认减去了10ms,从而减去误差。
            // 经过以上的微调,最后一秒的显示时间会由于10ms延迟的积累,导致显示时间比1s长max*10ms的时间,其他时间的显示正常,总时间正常
            countDownTimer = new CountDownTimer(10 * 1000, 1 * 1000 - 10) {//倒计时的最大值10s;倒计时的间隔1s
    
                @Override
                public void onTick(long time) {
                    // 第一次调用会有1-10ms的误差,因此需要+15ms,防止第一个数不显示,第二个数显示2s
                    mButton.setText("(" + ((time + 15) / 1000) + "秒)");
                    //Logger.d("time = " + (time) + " text = " + ((time + 15) / 1000));
                }
    
                @Override
                public void onFinish() {
                    mButton.setEnabled(true);
                    if (btnText == null) {
                        mButton.setText("验证码");
                    } else {
                        mButton.setText(btnText);//设置button上的文字
                    }
                    if (listener != null) {
                        listener.finish();
                    }
                }
            };
        }
    
        /**
         * 开始倒计时
         */
        public void start() {
            mButton.setEnabled(false);
            countDownTimer.start();
        }
    
        /**
         * 关闭倒计时,一般onDestroy里会用到
         */
        public void cancel() {
            if (countDownTimer != null) {
                countDownTimer.cancel();
            }
        }
    
        /**
         * 设置倒计时结束的监听器
         *
         * @param listener
         */
        public void setOnFinishListener(OnFinishListener listener) {
            this.listener = listener;
        }
    
        /**
         * 计时结束的回调接口(外部要调用所以用public)
         */
        public interface OnFinishListener {
            void finish();
        }
    
        /**
         * 设置按钮里的文字
         */
        public void setBtnText(String btnText) {
            this.btnText = btnText;
        }
    }
    

    在activity中的实现方法参考如下:

    import android.content.Context;
    import android.content.Intent;
    import android.view.View;
    
    import com.hjqjl.whdemo.databinding.ActivityCountDownBinding;
    import com.hjqjl.whdemo.utils.CountDownButtonHelper;
    import com.hjqjl.whdemo.utils.ToastUtils;
    
    /**
     * 倒计时按钮
     */
    public class CountDownActivity extends BaseActivity {
        public static void actionStart(Context context) {
            Intent intent = new Intent(context, CountDownActivity.class);
            context.startActivity(intent);
        }
    
        private CountDownButtonHelper countDownButtonHelper;
        private ActivityCountDownBinding binding;
    
        @Override
        protected void initData() {
            binding = ActivityCountDownBinding.inflate(getLayoutInflater());
            View view = binding.getRoot();
            setContentView(view);
    
            countDownButtonHelper = new CountDownButtonHelper(binding.btnCountDown);
        }
    
        @Override
        protected void processLogic() {
            binding.btnCountDown.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    countDownButtonHelper.start();
                }
            });
            countDownButtonHelper.setOnFinishListener(new CountDownButtonHelper.OnFinishListener() {
                @Override
                public void finish() {
                    ToastUtils.showToast(mContext, "倒计时结束调用");
                }
            });
        }
    
        @Override
        protected void onDestroy() {
            if (null != countDownButtonHelper) {
                countDownButtonHelper.cancel();
            }
            super.onDestroy();
        }
    }
    

    源码:https://gitee.com/hjqjl/WhDemo

    展开全文
  • 主要介绍了js实现的倒计时按钮,实例分析了javascript倒计时效果的相关实现技巧,需要的朋友可以参考下
  • 主要介绍了jQuery实现倒计时按钮功能代码分享,一般用在短信发送倒计时按钮情景,本文给出了几个例子,需要的朋友可以参考下
  • 安卓倒计时按钮TimeButton

    千次下载 热门讨论 2015-02-06 13:25:17
    获取验证码时候的倒计时按钮http://blog.csdn.net/yung7086/article/details/43563033
  • Swift倒计时按钮Demo

    2016-01-10 10:51:07
    Swift倒计时按钮Demo,用Extension封装
  • 作者STShenZhaoliang,源码STCountDownButton,这是一个非常简单易用的倒计时按钮特效,大家可以了解一下。
  • 验证码倒计时按钮

    2019-10-07 20:13:11
    注:验证码倒计时按钮的应用是非常普遍的,该Blog就和你一起来写一个IDCountDownButton来实现验证码倒计时的效果。你可以想使用普通的UIButton类型按钮一样,只需要设置其倒计时时长(若未设置,默认为60秒),就可以...

    注:验证码倒计时按钮的应用是非常普遍的,该Blog就和你一起来写一个IDCountDownButton来实现验证码倒计时的效果。你可以想使用普通的UIButton类型按钮一样,只需要设置其倒计时时长(若未设置,默认为60秒),就可以轻松的实现点击countDownButton开始倒计时,倒计时结束方可重新点击。

    实现效果

    • 如图

      783575-20160109100207293-584202896.gif

    实现思路

    • 自定义一个IDCountDownButton,重写 beginTrackingWithTouch:withEvent: 拦截button的点击事件,根据是否正在倒计时决定是否响应并传递button的点击事件(若倒计时正在进行中,再次点击不会重新开始倒计时)
    • 是用NSTimer定时器,定时改变IDCountDownButton的title
    • 若倒计时结束,取消定时器并回复倒计时时长(使IDCountDownButton具备再次开始倒计时的能力)
    • 在IDCountDownButton销毁时,同样取消定时器

    实现步骤

    • 添加相关的属性
      • 公有属性(public)

        @interface IDCountDownButton : UIButton
        /** 验证码倒计时的时长 */
        @property (nonatomic, assign) NSInteger durationOfCountDown;
        @end
      • 私有属性

        @interface IDCountDownButton ()
        /** 保存倒计时按钮的非倒计时状态的title */
        @property (nonatomic, copy) NSString *originalTitle;
        /** 保存倒计时的时长 */
        @property (nonatomic, assign) NSInteger tempDurationOfCountDown;
        /** 定时器对象 */
        @property (nonatomic, strong) NSTimer *countDownTimer;
        @end
    • 重写setter
      • title属性的setter
        • 私有属性originalTitle用来暂存开始计时前button的标题,即用户设置的button的标题,通常是“获取验证码”
        • 需要屏蔽计时过程中,title更新时改变originalTitle的值

          - (void)setTitle:(NSString *)title forState:(UIControlState)state {
              [super setTitle:title forState:state];
              // 倒计时过程中title的改变不更新originalTitle
              if (self.tempDurationOfCountDown == self.durationOfCountDown) {
                  self.originalTitle = title;
              }
          }
      • durationOfCountDown属性的setter
        • 设置tempDurationOfCountDown的值
        • tempDurationOfCountDown的作用:倒计时;与durationOfCountDown配合判断当前IDCountDownButton是否具备重新开始倒计时的能力

          - (void)setDurationOfCountDown:(NSInteger)durationOfCountDown {
              _durationOfCountDown = durationOfCountDown;
              self.tempDurationOfCountDown = _durationOfCountDown;
          }
    • 初始化
      • 设置倒计时的默认时长为60妙
      • 设置IDCountDownButton默认的title为“获取验证码”

        - (instancetype)initWithFrame:(CGRect)frame {
            if (self = [super initWithFrame:frame]) {
                // 设置默认的倒计时时长为60秒
                self.durationOfCountDown = 60;
                // 设置button的默认标题为“获取验证码”
                [self setTitle:@"获取验证码" forState:UIControlStateNormal];
            }
            return self;
        }
        - (instancetype)initWithCoder:(NSCoder *)aDecoder {
            if (self = [super initWithCoder:aDecoder]) {
                // 设置默认的倒计时时长为60秒
                self.durationOfCountDown = 60;
                // 设置button的默认标题为“获取验证码”
                [self setTitle:@"获取验证码" forState:UIControlStateNormal];
            }
            return self;
        }
    • 拦截IDCountDownButton的点击事件,判断是否开始倒计时
      • 若tempDurationOfCountDown等于durationOfCountDown,说明未开始倒计时,响应并传递IDCountDownButton的点击事件;否则,不响应且不传递。

        - (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
            // 若正在倒计时,不响应点击事件
            if (self.tempDurationOfCountDown != self.durationOfCountDown) {
                return NO;
            }
            // 若未开始倒计时,响应并传递点击事件,开始倒计时
            [self startCountDown];
            return [super beginTrackingWithTouch:touch withEvent:event];
        }
    • 倒计时
      • 创建定时器,开始倒计时

        - (void)startCountDown {
            // 创建定时器
            self.countDownTimer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(updateIDCountDownButtonTitle) userInfo:nil repeats:YES];
            // 将定时器添加到当前的RunLoop中(自动开启定时器)
            [[NSRunLoop currentRunLoop] addTimer:self.countDownTimer forMode:NSRunLoopCommonModes];
        }
      • 更新IDCountDownButton的title为倒计时剩余的时间

        - (void)updateIDCountDownButtonTitle {
            if (self.tempDurationOfCountDown == 0) {
                // 设置IDCountDownButton的title为开始倒计时前的title
                [self setTitle:self.originalTitle forState:UIControlStateNormal];
                // 恢复IDCountDownButton开始倒计时的能力
                self.tempDurationOfCountDown = self.durationOfCountDown;
                [self.countDownTimer invalidate];
            } else {
                // 设置IDCountDownButton的title为当前倒计时剩余的时间
                [self setTitle:[NSString stringWithFormat:@"%zd秒", self.tempDurationOfCountDown--] forState:UIControlStateNormal];
            }
        }
      • 移除定时器

        - (void)dealloc {
            [self.countDownTimer invalidate];
        }
    • 使用示例
      • 添加vertificationCodeIDCountDownButton属性

        @interface ViewController ()
        /** 验证码倒计时的button */
        @property (nonatomic, strong) IDCountDownButton *vertificationCodeIDCountDownButton;
        @end
      • 创建vertificationCodeIDCountDownButton并进行相关设置

        - (void)viewDidLoad {
            [super viewDidLoad];
            // 创建vertificationCodeIDCountDownButton
            self.vertificationCodeIDCountDownButton = [[IDCountDownButton alloc] initWithFrame:CGRectMake(160, 204, 120, 44)];
            // 添加点击事件
            [self.vertificationCodeIDCountDownButton addTarget:self action:@selector(vertificationCodeIDCountDownButtonClick:) forControlEvents:UIControlEventTouchUpInside];
            // 设置标题相关属性
            [self.vertificationCodeIDCountDownButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
            [self.vertificationCodeIDCountDownButton setTitle:@"获取验证码" forState:UIControlStateNormal];
            // 设置背景图片
            [self.vertificationCodeIDCountDownButton setBackgroundImage:[UIImage imageNamed:@"redButton"] forState:UIControlStateNormal];
            // 设置倒计时时长
            self.vertificationCodeIDCountDownButton.durationOfCountDown = 10;
            // 将vertificationCodeIDCountDownButton添加的控制器的view中
            [self.view addSubview:self.vertificationCodeIDCountDownButton];
        }
      • 实现点击事件触发的操作

        - (void)vertificationCodeIDCountDownButtonClick:(UIButton *)button {
            // TODO:调用服务器接口,获取验证码
        }

    关于AppIcon

    • 添加AppIcon时需要遵循以下规则
      • 命名,以Icon开头(首字母大写),跟上@2x/@3x,如图:

        783575-20160109100303575-1109875190.png

      • 尺寸,必须按要求设置尺寸,如图

        783575-20160109100327746-1250100866.png

        • 图中所示的60pt对应的图片尺寸是:
          • 2x:120px X 120px
          • 3x:180px X 180px

    转载于:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/5115513.html

    展开全文
  • <!...<...<head> <meta charset="utf-8"> <...jquery倒计时按钮常用于验证码倒计时</title></head><body style="padding:50px;"><h1> jquery倒计时...

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>jquery倒计时按钮常用于验证码倒计时</title>
    </head>
    <body style="padding:50px;">
    <h1> jquery倒计时按钮常用于验证码倒计时演示</h1>
    <h3>使用演示 显示为 秒</h3>
    <p style="margin-bottom: 40px;">
    <button type="button" id="test1">获取验证码</button>
    <button type="button" id="test1-clear">清理验证码</button>
    </p>
    <h3>使用演示 显示为 分:秒</h3>
    <p style="margin-bottom: 40px;">
    <button type="button" id="test2">获取验证码</button>
    </p>
    <h3>使用演示 显示为 天:时:分:秒</h3>
    <p style="margin-bottom: 40px;">
    <button type="button" id="test3">获取验证码</button>
    </p>
    <h3>使用演示 显示为 天:时:分:秒</h3>
    <p style="margin-bottom: 40px;">
    <button type="button" id="test4">获取验证码</button>
    </p>

    <script src="http://XXX/js/jquery/1.12.4/jquery-1.12.4.min.js"></script>
    <script>

    //jquery倒计时按钮常用于验证码倒计
    function buttonCountdown($el, msNum, timeFormat) {
    var text = $el.data("text") || $el.text(),
    timer = 0;
    $el.prop("disabled", true).addClass("disabled")
    .on("bc.clear", function () {
    clearTime();
    });

    (function countdown() {
    var time = showTime(msNum)[timeFormat];
    $el.text(time + '后失效');
    if (msNum <= 0) {
    msNum = 0;
    clearTime();
    } else {
    msNum -= 1000;
    timer = setTimeout(arguments.callee, 1000);
    }
    })();

    function clearTime() {
    clearTimeout(timer);
    $el.prop("disabled", false).removeClass("disabled").text(text);
    }

    function showTime(ms) {
    var d = Math.floor(ms / 1000 / 60 / 60 / 24),
    h = Math.floor(ms / 1000 / 60 / 60 % 24),
    m = Math.floor(ms / 1000 / 60 % 60),
    s = Math.floor(ms / 1000 % 60),
    ss = Math.floor(ms / 1000);

    return {
    d: d + "天",
    h: h + "小时",
    m: m + "分",
    ss: ss + "秒",
    "d:h:m:s": d + "天" + h + "小时" + m + "分" + s + "秒",
    "h:m:s": h + "小时" + m + "分" + s + "秒",
    "m:s": m + "分" + s + "秒"
    };
    }

    return this;
    }

    //使用演示 显示为 秒
    $("#test1").on("click",function(){
    buttonCountdown($(this), 1000 * 60 * 3, "ss");
    });

    //使用演示 显示为 分:秒
    $("#test2").on("click",function(){
    buttonCountdown($(this), 1000 * 60 * 3, "m:s");
    });

    //使用演示 显示为 时:分:秒
    $("#test3").on("click",function(){
    buttonCountdown($(this), 1000 * 60 * 3, "h:m:s");
    });

    //使用演示 显示为 天:时:分:秒
    $("#test4").on("click",function(){
    buttonCountdown($(this), 1000 * 60 * 3, "d:h:m:s");
    });

    //清理$("#test1")的倒计时 比如请求出错或者什么原因要清理倒计时按钮
    $("#test1-clear").on("click",function(){
    $("#test1").trigger("bc.clear");
    });
    </script>
    </body>
    </html>

    转载于:https://www.cnblogs.com/dongdong415/p/10743917.html

    展开全文
  • 主要为大家详细介绍了Android自定义TimeButton实现倒计时按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 由于苹果官方对iOS系统后台任务管控非常严格,所以在iOS系统要实现倒计时进入后台或者切换页面之后依然能保持倒计时状态会比较繁琐或困难,但倒计时按钮是经常用到、司空见惯!经常看到不太友好的倒计时按钮表现为,...
  • ios-倒计时按钮.zip

    2019-07-11 18:21:51
    一个简单易用的倒计时按钮 github地址:https://github.com/STShenZhaoliang/STCountDownButton
  • ReactNative-CountDownButton 封装的一个倒计时按钮

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,486
精华内容 994
关键字:

倒计时按钮