关于自定义View的构造方法里面的参数的含义可以参考:

http://www.cnblogs.com/angeldevil/p/3479431.html

代码:

倒计时类:

public class CountDownBtn extends Button implements View.OnClickListener
{private static final String TAG = CountDownBtn.class.getSimpleName();private String TIP;private Integer TOTALTIME;private int tempTotalTime;private Integer normalBg;private Integer countTimeBg;private Activity activity;private final static String SECOND = "秒";private Timer timer;private GetGenerateCodeListener listener;private CountDownBtn instance;public CountDownBtn(Context context){this(context, null);}public CountDownBtn(Context context, AttributeSet attrs){this(context, attrs, 0);}public CountDownBtn(Context context, AttributeSet attrs, int defStyleAttr){super(context, attrs, defStyleAttr);init(context, attrs, defStyleAttr);}private void init(Context context, AttributeSet attrs, int defStyleAttr){instance = this;if(attrs != null){TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CountDown);if(array.length() > 0){TIP = array.getString(R.styleable.CountDown_defTip);tempTotalTime = TOTALTIME = array.getInteger(R.styleable.CountDown_totalTime, 0);normalBg = array.getResourceId(R.styleable.CountDown_normalBg, 0);countTimeBg = array.getResourceId(R.styleable.CountDown_countTimeBg, 0);LogUtils.i(TAG, "data " + TIP + "  " + tempTotalTime + "  " + normalBg + "  " + countTimeBg);checkMessage(tempTotalTime, TIP, normalBg, countTimeBg);array.recycle();}}}public void setActivity(Activity activity){if (activity == null) {throw new NullPointerException("activity non null ");}this.activity = activity;}private void start(){timer = new Timer();timer.schedule(new TimerTask(){@Overridepublic void run(){activity.runOnUiThread(new Runnable(){@Overridepublic void run(){if (TOTALTIME > 0) {CountDownBtn.this.instance.setText((TOTALTIME) + SECOND);TOTALTIME = TOTALTIME - 1;} else {CountDownBtn.this.instance.setBackground(CountDownBtn.this.getResources().getDrawable(normalBg));CountDownBtn.this.instance.setText(TIP);timer.cancel();TOTALTIME = tempTotalTime;CountDownBtn.this.instance.setClickable(true);}}});}}, 0, 1000);}/***该法是在layout中不设置相关属性,则需要在code里面动态的设置属性* @param totalTime    倒计时的时间范围* @param tipId        默认的提示语* @param normalBgId   刚开始的默认背景.传入对应的Id* @param countTimeBgId   倒计时时的背景颜色.传入对应的ID*/public void setMessage(int totalTime,int tipId,int normalBgId,int countTimeBgId){tempTotalTime = this.TOTALTIME = totalTime;this.TIP = this.getResources().getString(tipId);normalBg = normalBgId;countTimeBg = countTimeBgId;checkMessage(TOTALTIME, TIP, normalBg, countTimeBg);}/*** 校验数据合法性.(如果数据不合法,则使用默认值).* @param totalTime* @param tip* @param normalBgId* @param countTimeBgId*/private void checkMessage(int totalTime,String tip,int normalBgId,int countTimeBgId){LogUtils.i(TAG,"checkMessage user count");if(totalTime <= 0){tempTotalTime = totalTime = 60;}if(totalTime > 120){tempTotalTime = totalTime = 120;}if(TextUtils.isEmpty(tip)){TIP = this.getResources().getString(R.string.btn_generatecode);}if(normalBgId == 0){normalBg = R.color.colorAccent;    //默认背景,可以自己定义}if(countTimeBgId == 0){countTimeBg = R.color.colorPrimary;   //倒计时背景,可以自己定义}this.setBackground(getResources().getDrawable(normalBg));this.setText(TIP);this.setGravity(Gravity.CENTER);this.setOnClickListener(this);}public void cance(){if(timer != null){timer.cancel();}}@Overridepublic void onClick(View v){if(this.getText().equals(TIP)){this.setClickable(false);this.setBackground(this.getResources().getDrawable(countTimeBg));start();if(listener != null){listener.getGenerateCode();}}}/*** 单击获取验证码以后的回调,在里面进行获取验证码的各种操作(networker)*/public interface GetGenerateCodeListener{void getGenerateCode();}public void setGenerateCodeListener(GetGenerateCodeListener listener){this.listener = listener;}
}

属性设置(attr):

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="CountDown"><!--默认提示语--><attr name="defTip" format="string"></attr><!--总计的倒计时时间以秒为单位--><attr name="totalTime" format="integer"></attr><!--正常情况下的背景--><attr name="normalBg" format="reference"></attr><!--倒计时的背景颜色--><attr name="countTimeBg" format="reference"></attr></declare-styleable>
</resources>

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:clipToPadding="true"android:fitsSystemWindows="true"android:orientation="vertical"><android.support.v7.widget.Toolbarandroid:id="@+id/toolBarBossLogin"android:layout_width="fill_parent"android:layout_height="wrap_content"></android.support.v7.widget.Toolbar><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><android.support.design.widget.TextInputLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"><AutoCompleteTextViewandroid:id="@+id/tvPhone"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="@string/hint_phonenumber"android:inputType="phone"android:maxLines="1"android:singleLine="true"/></android.support.design.widget.TextInputLayout><com.channelsoft.ggsj.view.CountDownBtnandroid:id="@+id/btnGenerateCode"android:layout_width="90.0dp"android:layout_height="45.0dp"android:layout_weight="0"app:defTip = "@string/btn_generatecode"app:totalTime = "60"app:normalBg = "@android:color/holo_red_dark"app:countTimeBg = "@android:color/white"></com.channelsoft.ggsj.view.CountDownBtn></LinearLayout><android.support.design.widget.TextInputLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/tvPassword"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="@string/prompt_password"android:imeActionId="@+id/login"android:imeActionLabel="@string/action_sign_in_short"android:imeOptions="actionUnspecified"android:inputType="textPassword"android:maxLines="1"android:singleLine="true"/></android.support.design.widget.TextInputLayout><Buttonandroid:id="@+id/bntLogin"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/btn_login"/></LinearLayout>
</layout>

Activity:activity使用了Data Binding的技术,关于这个可以参考文档 :

https://segmentfault.com/a/1190000002876984

public class BossLoginActivity extends BaseActivity implements View.OnClickListener,CountDownBtn.GetGenerateCodeListener
{private ActivityBossLoginBinding binding ;private GenerateCodeViewModel generateCodeViewModel;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);binding = DataBindingUtil.setContentView(this,R.layout.activity_boss_login);binding.bntLogin.setOnClickListener(this);binding.btnGenerateCode.setActivity(this);binding.btnGenerateCode.setGenerateCodeListener(this);}@Overridepublic void onClick(View v){switch(v.getId()){case R.id.bntLogin:if(checkPhoneNumber()){generateCodeViewModel = new GenerateCodeViewModel();generateCodeViewModel.getGenerateCode(binding.tvPhone.getText().toString().trim());}break;case R.id.btnGenerateCode:break;}}@Overridepublic void getGenerateCode(){}@Overrideprotected void onDestroy(){super.onDestroy();binding.btnGenerateCode.cance();}private boolean checkPhoneNumber(){return true;}
}

代码比较简单,这里不多做介绍,有什么问题,欢迎批评,android小白一枚.

android自定义验证码倒计时View相关推荐

  1. android 自定义本地验证码demo,Android 自定义验证码输入框的实例代码(支持粘贴连续性)...

    需求 1.能自定义输入框个数和样式 2.支持长按粘贴或剪切板内容自动填充(粘贴连续性) 其中第2点是最为重要的,正是其他人没有这点,逼得自己弄一个 示例 别人的示例: 粘贴居然不支持连续性,只能粘贴第 ...

  2. 直播倒计时android,直播代码,Android实现验证码倒计时

    直播代码,Android实现验证码倒计时实现的相关代码 创建一个CountDownTimerUtils工具类 //倒计时函数 private class CountDownTimerUtilsexte ...

  3. android 获取验证码倒计时

    在开发时,登陆注册时必有的模块,下面是记录一下注册时获取验证码的方法:效果图如下: 获取验证码后,进入倒计时并且是不可点击的状态. 1.复制下面工具类到项目中 import android.graph ...

  4. Android图片上倒计时,Android自定义照相机倒计时拍照

    自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的秒数的 xmlns:tools="http://schemas ...

  5. Android 自定义验证码输入框

    1. 自定义手机验证码 自定义手机验证码,效果如下 很明显,一般的EditText是无法满足我们的需求,我们必须自定义一个手机验证码控件. 2. MobileVerifyItemView控件 在Mob ...

  6. android动画绘制扇形,Android自定义扇形倒计时实例代码

    一.概述 严格来说,我是Android小白,写的目的只是想作为知识储备而已-.但是想到别人或许会不小心搜到我的这篇,如果我只是简单的描述,别人有可能看不懂,说不定还被吐槽,那岂不是很冤吗? 所以,我还 ...

  7. android自定义LinearLayout和View

    自定义线性布局经常用到: 第一种是在扩展的LinearLayout构造函数中使用Inflater加载一个布局,并从中提取出相关的UI组件进行封装,形成一个独立的控件.在使用该控件时,由于它所有的子元素 ...

  8. Android 自定义评论回复view

    先上效果图: 一.创建xml 1.android_ceshi_activity <?xml version="1.0" encoding="utf-8"? ...

  9. android自定义空的view,ListView android中的自定义空视图

    如果ListView适配器中没有数据,我想显示刷新Button和TextView.我还希望能够向将重新加载列表的按钮添加单击侦听器.以下是我定义当前活动的方式: protected void onCr ...

最新文章

  1. CCNA学习笔记--路由器的基本配置
  2. Ubuntu创建新用户并增加管理员权限
  3. arduino 读取当前时间_Arm难以撼动,暴露下的Arduino与RISCV联合体就是个笑话
  4. PAT (Basic Level) Practise:1037. 在霍格沃茨找零钱
  5. 计算并输出1000以内的所有“完数”之和
  6. 鸿蒙系统是噱头和谈判策略?华为梁华:是针对IoT的操作系统
  7. 关于StringIndexOutOfBoundsException那些事~
  8. 重学JAVA基础(三):动态代理
  9. 【softmax分类】基于matlab梯度下降softmax回归minist数据分类【含Matlab源码 1645期】
  10. 『水晶报表』实现打印
  11. 【产业互联网周报】罗永浩AR创业公司获美团领投;英特尔自动驾驶子公司Mobileye敲定IPO条款;星环科技登陆科创板...
  12. A银行B分行零售营销人员激励机制研究
  13. build-essential 软件包
  14. 2015 android 5.0 手机排行榜,2015上半年顶级新款Android手机汇总
  15. java制作小鱼吃大鱼_大鱼吃小鱼游戏(Java编写)
  16. 用excel/WPS制作酷炫数据可视化大屏(附模板)
  17. bsl是计算机术语吗,一种BSL的确定方法、BIER-TE控制器和计算机存储介质与流程...
  18. 开发工作中常用网站宝典(建议收藏!!!)
  19. K8S之ipvs负载均衡原理
  20. 计算机天才陈立杰:16岁拒上清华,婉拒谷歌,网瘾少年如何逆袭?

热门文章

  1. 02-QMainWindow
  2. ArcGIS基础:获取栅格数据边界的线要素和独立格网面
  3. AE基础之添加点、线、面要素
  4. 电脑接通电源时不能睡眠休眠问题解决
  5. 插入硬盘:Raid卡做磁盘阵列及服务器挂载
  6. C++数组过大时出现的编译错误:(.text+0x165): 截断重寻址至相符: R_X86_64_32S
  7. RW、RO、ZI段的含义
  8. 内网渗透之内网信息收集(综合)
  9. 特别编辑--windows+python+django实现前端页面上传到指定路径生成个性化二维码
  10. Vue教程-4-Vue CLI快速入门