自定义倒计时组件

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值