废话不多说直接上代码:
/**
* des:短信倒计时
* @author ChenQ
* @date 2017-11-30
*/
public class CountButton extends AppCompatButton {
public interface OnCountDownFinishListener {
/**
* 计时结束回调
*/
void onFinished();
}
private static final String TAG = "CountButton";
private boolean mRunning = false;
private boolean mStarted = false;
private long mSecondInFuture = 3;
private String mDefaultText;
private String mFormatString;
private CountDownTimer mCountDownTimer;
private OnCountDownFinishListener mOnCountDownFinishListener;
public CountButton(Context context) {
this(context, null);
}
public CountButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CountButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.CountButton, defStyleAttr, 0);
mSecondInFuture = a.getInt(R.styleable.CountButton_secondInFuture, (int) mSecondInFuture);
mFormatString = a.getString(R.styleable.CountButton_format);
a.recycle();
}
public void start() {
mStarted = true;
updateRunning();
Log.e(TAG, "start");
}
public void stop() {
mStarted = false;
updateRunning();
Log.e(TAG, "stop");
}
private void updateRunning() {
boolean running = mStarted;
if (running != mRunning) {
if (running) {
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
}
setEnabled(false);
mDefaultText = getText().toString();
mCountDownTimer = new CountDownTimer(mSecondInFuture * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
setText(String.format(mFormatString, millisUntilFinished / 1000));
Log.e(TAG, String.format(mFormatString, millisUntilFinished / 1000));
}
@Override
public void onFinish() {
//倒计时结束
mRunning = false;
setEnabled(true);
setText(mDefaultText);
if (mOnCountDownFinishListener != null) {
mOnCountDownFinishListener.onFinished();
}
}
}.start();
} else {
// removeCallbacks(mTickRunnable);
setEnabled(true);
setText(mDefaultText);
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
}
}
mRunning = running;
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
stop();
}
public long getSecondInFuture() {
return mSecondInFuture;
}
public void setSecondInFuture(long secondInFuture) {
this.mSecondInFuture = secondInFuture;
}
public String getFormatString() {
return mFormatString;
}
public void setFormatString(String formatString) {
this.mFormatString = formatString;
}
public OnCountDownFinishListener getOnCountDownFinishListener() {
return mOnCountDownFinishListener;
}
public void setOnCountDownFinishListener(OnCountDownFinishListener listener) {
this.mOnCountDownFinishListener = listener;
}
}
增加 attr.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CountButton">
<attr name="format" format="string"/>
<attr name="secondInFuture" format="integer"/>
</declare-styleable>
</resources>
使用方法很简单:
- 1 代码实现(java ):
CountButton textView = new CountButton(this);
textView.setText("发送短信");
textView.setFormatString("%s秒");
textView.setSecondInFuture(3);
textView.setBackgroundResource(R.color.colorAccent);
textView.setTextColor(Color.WHITE);
textView.setPadding(20,15,20,15);
textView.setOnCountDownFinishListener(() -> {
textView.stop();
startActivity(new Intent(getApplicationContext(),LiveHikActivity.class));
});
textView.setOnClickListener(v -> textView.start());
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER;
pageContainer.addView(textView,layoutParams);
- 2 XMl 实现
<com.colorchen.lib.video.view.CountDownButton
android:id="@+id/countTv"
android:layout_width="96dp"
android:layout_height="48dp"
android:background="@color/colorAccent"
android:gravity="center"
android:layout_gravity="center"
android:text="发送短信"
android:textColor="@android:color/white"
android:textSize="16sp"
app:format="%s秒"
app:secondInFuture="3" />