1、介绍
1、Android开发中经常用到一个空间去倒计时的控件。在官方的控件中没有到类似的控件,便自己制作一个
2、原理
1、继承自Textview,当控件被创建时,开始倒计时。
2、当窗口消失时,移除倒计时。
3、实现
1、定义CallBack接口
callBack接口用于适配各种,程序的结果调用
public interface CallBack {
void success();
void success(String message);
void fail();
void fail(String message);
}
2、创建CallBack的适配器
少写一些,接口的代码,让程序更加的优雅
public abstract class CallBackAdapter implements CallBack {
@Override
public void success(){
}
@Override
public void success(String message) {
}
@Override
public void fail() {
}
@Override
public void fail(String message) {
}
}
3、实现具体的控件
/**
*@date createTime 2020/10/26
*@author Zhoujianlong
*@Description 倒计时
*@version 1.0
*/
@SuppressLint("AppCompatCustomView")
public class TimeText extends TextView {
Logger logger = LoggerFactory.getLogger(TimeText.class);
int second;//记录当前的时间
Handler handler;
CallBackAdapter callBackAdapter;
public TimeText(Context context) {
super(context);
}
public void setCallBackAdapter(CallBackAdapter callBackAdapter) {
this.callBackAdapter = callBackAdapter;
}
public TimeText(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TimeText);
String startTime = a.getString(R.styleable.TimeText_my_Text);//获取xml文件中设置的值
a.recycle();
setText(startTime);//设置界面显示的初始值
second = Integer.parseInt(startTime);
initView();
}
@Override
public void onVisibilityAggregated(boolean isVisible) {
super.onVisibilityAggregated(isVisible);
// handler.removeCallbacks(mTicker);
}
private void initView() {
handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
TimeText.this.setText(msg.what+"");
}
};
handler.post(mTicker);
}
//当从窗口消失,卸载掉时移除倒计时
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
handler.removeCallbacks(mTicker);
}
//实现倒计时的具体逻辑
private final Runnable mTicker = new Runnable() {
public void run() {
onTimeChanged();
//当还有时间时
if(second>0)
{
//获取下一秒的时间
long now = SystemClock.uptimeMillis();
long next = now + (1000 - now % 1000);
second--;
logger.info(second+"");
handler.postAtTime(mTicker, next);
}//当时间耗尽时
else {
if(callBackAdapter!=null)
{
callBackAdapter.success();
}
}
}
private void onTimeChanged() {
Message message = handler.obtainMessage();
message.what = second;
handler.sendMessage(message);
}
};
}
style文件
<declare-styleable name="TimeText">
<attr name="my_Text" format="string"/>
</declare-styleable>