自定义倒计时TextView

来源:互联网 发布:诺基亚5800软件下载 编辑:程序博客网 时间:2024/06/07 00:37

I don't want to survive I want to live --- 鸡汤走起

做了这么多的项目 越来越反感重复的代码重复写了  有人说可以ctrl+c 和ctrl  但是有的代码很多 ,直接复制过来还得去整理,很烦.  所以决定要改掉这个习惯,尽量按照功能去把功能抽出来.今天就简单做了一个.虽然简陋,但是是开始 。分享一下.

每个项目都有获取验证码这个功能,而且这个逻辑一样,只是样式不一样罢了,由于以前都是在注册或者忘记密码出来,所以就抽出来一个父类。

代码如下

private static long millisInFuture = 60000;private static long countDownInterval = 1000;private TimeCount time;@BindView(R.id.edAccount)protected EditText edAccount;@BindView(R.id.btnGetCode)protected TextView tvGetCode;@BindView(R.id.edCode)protected EditText edCode;protected String account;protected String code;@OnClick(R.id.btnGetCode)public void onClick(View view) {    getCode();}/* * 得到验证码 */private void getCode() {    if (isMobileNoCorrect(edAccount)) {        toSubscribe(HttpUtils.getApi().getCode(account), new ProgressSubscriber<String>(this) {            @Override            public void onNext(String httpResult) {            }        });    }}class TimeCount extends CountDownTimer {    TextView tvGetCode;    public TimeCount(long millisInFuture, long countDownInterval) {        super(millisInFuture, countDownInterval);    }    public TimeCount(long millisInFuture, long countDownInterval, TextView tvGetCode) {        super(millisInFuture, countDownInterval);        this.tvGetCode = tvGetCode;    }    @Override    public void onFinish() {// 计时完毕        tvGetCode.setText("获取验证码");        tvGetCode.setClickable(true);    }    @Override    public void onTick(long millisUntilFinished) {// 计时过程        tvGetCode.setClickable(false);// 防止重复点击        tvGetCode.setText("剩余" + millisUntilFinished / 1000 + "");    }}
用的也挺happy  可是项目突然在一个fragment里面出现了一个要获取验证码  顿时崩溃了. fragment 不能继承activity.

思前想后 这能自定义一个textView 这样就灵活多了.


private static final String INITTEXT = "获取验证码";private static final String FINISHTEXT = "重新获取";private long millisInFuture;// 结束的时间private int countDownInterval = 1000;//倒计时间隔  默认一秒private CountDownTimer timeCount;private boolean isRuning; // 是否正在运行private String mStartText;// 开始时文本private String mFinishText;// 完成倒计时后的文本显示private final int CODE = 1;//验证码private final int TIME = 2;// 时间private int type;public CountDownTextView(Context context) {    this(context, null);}public CountDownTextView(Context context, AttributeSet attrs) {    super(context, attrs);    initData();}public void setCountDownInterval(int countDownInterval) {    this.countDownInterval = countDownInterval;}public boolean isRuning() {    return isRuning;}public void setRuning(boolean runing) {    isRuning = runing;}public void setmFinishText(String mFinishText) {    this.mFinishText = mFinishText;}public void setMillisInFuture(long millisInFuture) {    this.millisInFuture = millisInFuture;}public void setmStartText(String mStartText) {    this.mStartText = mStartText;}public void setTimeCount(CountDownTimer timeCount) {    this.timeCount = timeCount;}public void setType(int type) {    this.type = type;}/** * 初始化数据 */public void initData() {    mStartText = INITTEXT;    setText(mStartText);    mFinishText = FINISHTEXT;    millisInFuture = 60000;    type = TIME;}/** * 开始倒计时 */public void startCountDown() {    setClickable(false);    setText(mStartText);    isRuning = true;    if (timeCount == null) {        timeCount = new TimeCount();    }    timeCount.start();}/** * 结束倒计时 */public void endCountDown() {    setText(mFinishText);    setClickable(true);    isRuning = false;}/** * 停止 */public void stopCountDown() {    endCountDown();    if (timeCount != null) {        timeCount.cancel();    }}// 点击事件@Overridepublic boolean onTouchEvent(MotionEvent event) {    if (event.getAction() == MotionEvent.ACTION_DOWN) {        if (isRuning) {            return false;        } else {            startCountDown();        }    }    return super.onTouchEvent(event);}/** * 时间倒计时 */class TimeCount extends CountDownTimer {    public TimeCount() {        super(millisInFuture, countDownInterval);    }    @Override    public void onFinish() {// 计时完毕        endCountDown();    }    @Override    public void onTick(long millisUntilFinished) {// 计时过程        if (type == TIME) {            setText(DateUtils.getFormatDate(DateUtils.COMMON_TIME, millisUntilFinished));        } else if (type == CODE) {            StringBuilder builder = new StringBuilder();            builder.append("剩余").append(millisUntilFinished / 1000).append("");            setText(builder.toString());        }    }}

只需要  调用startCountDown 就可以实现  倒计时功能   现在还没又发现什么问题 一起以后会继续更新一个这个控件..



0 0
原创粉丝点击