Android自定义View:倒计时按钮(获取验证码按钮)

效果图

这里写图片描述这里写图片描述这里写图片描述

CountDownTimer类

Java自带的倒计时器类,使用方法如下:

  1. 继承该类,初始化参数super(millisInFuture, countDownInterval);//参数依次为总时长,和计时的时间间隔
  2. 重写两个方法onTick(long millisUntilFinished) //计时过程中执行的方法onFinish() //计时结束执行的方法

  3. 使用:TimeCoutn time = new TimeCount(60000,1000); time.start();

实现

定义属性

 <declare-styleable name="TimingButton">
        <!--结束后的文字-->
        <attr name="tb_psText" format="string" /> 
        <!--计时总时长,毫秒-->
        <attr name="tb_totalTime" format="integer" />
        <!--计时时间间隔,毫秒-->
        <attr name="tb_timeInterval" format="integer" />
    </declare-styleable>

默认样式

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorAccent" />
            <corners android:radius="6dp" />
        </shape>
    </item>
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <solid android:color="@color/base_gray" />
            <corners android:radius="6dp" />
        </shape>
    </item>
</selector>

继承Button实现自定义View

/**
 * @author DeMon
 * @date 2018/6/26
 * @description 倒计时按钮
 */
@SuppressLint("AppCompatCustomView")
public class TimingButton extends Button {
    private int total, interval;
    private String psText;

    public TimingButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 获取自定义属性,并赋值
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.TimingButton);
        total = typedArray.getInteger(R.styleable.TimingButton_tb_totalTime, 60000);
        interval = typedArray.getInteger(R.styleable.TimingButton_tb_timeInterval, 1000);
        psText = typedArray.getString(R.styleable.TimingButton_tb_psText);
        setBackgroundResource(R.drawable.timing_button); //设置默认样式
        typedArray.recycle();
    }

    //执行
    public void start() {
        TimeCount time = new TimeCount(total, interval);
        time.start();
    }

    public class TimeCount extends CountDownTimer {
        private long countDownInterval;

        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);//参数依次为总时长,和计时的时间间隔
            this.countDownInterval = countDownInterval;
        }

        @Override
        public void onFinish() {//计时完毕时触发
            setText(psText);
            setEnabled(true);
        }

        @SuppressLint("SetTextI18n")
        @Override
        public void onTick(long millisUntilFinished) {//计时过程显示
            setEnabled(false);
            setText(millisUntilFinished / countDownInterval + "秒");
        }
    }
}

如何使用

 <com.demon.baseui.view.TimingButton
        android:id="@+id/btn"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:text="获取验证码"
        android:textColor="@color/base_white"
        android:textSize="20sp"
        app:tb_psText="重新获取"
        app:tb_totalTime="5000" />
  TimingButton btn;
  ...
  btn = findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btn.start();
            }
        });

总结

  1. 也可以使用Timer或者Handler实现,但是不如CountDownTimer方便。
  2. 除新增了额外的三个属性,其余跟Button完全一致。
  3. 直接复制即可使用,代码比较简单就不放源码了。

猜你喜欢

转载自blog.csdn.net/demonliuhui/article/details/80818051
今日推荐