自定义倒计时TextView

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();
    }
}


// 点击事件
@Override
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值