1、自定义Button类

public class CountDownButton extends android.support.v7.widget.AppCompatButton implements View.OnClickListener {    private Context mContext;    private OnClickListener mOnClickListener;    private Timer mTimer;//调度器    private TimerTask mTask;    private int temp_duration;    private int countDownTime = 60000;//默认需要倒计时的时间毫秒数    private String countDownText;//倒计时之后的文字显示    private String countDowningFormat ;//正在倒计时时要显示的格式    public CountDownButton(Context context) {        super(context);        init(context, null);    }    public CountDownButton(Context context, AttributeSet attrs) {        super(context, attrs);        init(context, attrs);    }    private Handler mHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            String text = String.format(countDowningFormat, temp_duration / 1000);            CountDownButton.this.setText(text);            temp_duration -= 1000;            if (temp_duration < 0) { //倒计时结束                CountDownButton.this.setEnabled(true);                CountDownButton.this.setText(countDownText);                stopTimer();            }        }    };    private void init(Context context, AttributeSet attrs) {        this.mContext = context;        countDowningFormat = "重新获取(%d)";        countDownText = "重新获取";        if(null != attrs){            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CountDown);            countDownTime = array.getInt(R.styleable.CountDown_countDownTime, 0);            countDownText = array.getString(R.styleable.CountDown_countDownText);            if(!TextUtils.isEmpty(array.getString(R.styleable.CountDown_countDowningFormat))){                countDowningFormat = array.getString(R.styleable.CountDown_countDowningFormat);            }            array.recycle();        }        setOnClickListener(this);    }    @Override    public void setOnClickListener(OnClickListener onClickListener) {//提供外部访问方法        if (onClickListener instanceof CountDownButton) {            super.setOnClickListener(onClickListener);        } else {            this.mOnClickListener = onClickListener;        }    }    @Override    public void onClick(View view) {        if (mOnClickListener != null) {            mOnClickListener.onClick(view);        }        startTimer();    }    //计时开始    private void startTimer(){        temp_duration = countDownTime;        CountDownButton.this.setEnabled(false);        mTimer = new Timer();        mTask = new TimerTask() {            @Override            public void run() {                mHandler.sendEmptyMessage(0x01);            }        };        mTimer.schedule(mTask, 0, 1000);//调度分配,延迟0秒,时间间隔为1秒    }    //计时结束    private void stopTimer(){        if (mTask != null) {            mTask.cancel();            mTask = null;        }        if (mTimer != null) {            mTimer.cancel();            mTimer = null;        }    }}
2、Layout使用

3、values attrs.xml文件中自定义属性
<?xml version="1.0" encoding="utf-8"?>                                

参考:

https://www.oschina.net/code/snippet_1187615_49484

http://blog.csdn.net/chengxu_hou/article/details/54972502

更多相关文章

  1. Android使用ccache减少编译时间
  2. 设置android系统时间
  3. android 监听系统时区变化,日期变化,时间变化
  4. 转化为当前的日期和时间
  5. android简单的日期时间选择器
  6. 干货文章整理(建议有时间多看几遍)
  7. Android(Java) GMT时间转换
  8. android造假 editView显示时间

随机推荐

  1. h5页面打开app,安卓端和苹果端
  2. 深入理解 Android Activity的生命周期
  3. android学习笔记之十二进程通信(IPC)
  4. android 相对定位布局方向详解
  5. 编译android源码出现的问题解析
  6. android直接利用opencv打开摄像头失败原
  7. android基础知识15:获得android系统信息03
  8. android:scrollbarStyle属性及滚动条和分
  9. android 设置透明效果
  10. android ethernet