Android自定义控件——获取验证码倒计时
目前为止,有很多地方都需要绑定用户手机号,发送短信,比如说找回密码,注册或者登陆,这些控件都是很常用的,不需要每次使用的时候都重新写一个,这样比较麻烦,也浪费时间。本人自定义了一些控件。
废话不多说,接下来就直奔主题,开始撸代码吧。
package com.morse.library.views;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;import com.morse.library.R;
import com.morse.library.utils.CountDown;/*** 带倒计时控件的+label+edittext的组合控件** @company:大后天* @Author:曾明* @Time:2017/8/21 19:14* @Description:*/
public class MLabelEditText extends LinearLayout implements View.OnClickListener {private TextView tvLabel;private EditText etEdit;private TextView tvCounter;private CountDown mCountDown;private long mTime;private long mInterval;private IRightClickListener mListener;public void setRightClickListener(IRightClickListener listener) {mListener = listener;}public MLabelEditText(Context context) {this(context, null);}public MLabelEditText(Context context, AttributeSet attrs) {super(context, attrs);initView(context, attrs);}public MLabelEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context, attrs);}private void initView(Context context, AttributeSet attrs) {
// setGravity(Gravity.CENTER_VERTICAL);
// setOrientation(HORIZONTAL);
// setWillNotDraw(false);View view = LayoutInflater.from(context).inflate(R.layout.include_label_editview, this);
// view.setBackgroundResource(R.drawable.shape_input_bg);tvLabel = (TextView) view.findViewById(R.id.lev_label);etEdit = (EditText) view.findViewById(R.id.lev_edit);tvCounter = (TextView) view.findViewById(R.id.lev_count);TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MLabelEditView);String label = ta.getString(R.styleable.MLabelEditView_m_lev_label);String hint = ta.getString(R.styleable.MLabelEditView_m_lev_edit_hint);String edit = ta.getString(R.styleable.MLabelEditView_m_lev_edit);String counter = ta.getString(R.styleable.MLabelEditView_m_lev_count);int vCount = ta.getInt(R.styleable.MLabelEditView_m_lev_count_visibilty, 0);int vLabel = ta.getInt(R.styleable.MLabelEditView_m_lev_label_visibilty, 0);int color = ta.getInt(R.styleable.MLabelEditView_m_lev_count_color, Color.WHITE);int ems = ta.getInt(R.styleable.MLabelEditView_m_lev_ems, 5);ta.recycle();setLabel(label);setEditHint(hint);setEditText(edit);setCountText(counter);setCountVisibility(tvLabel, vLabel);setCountVisibility(tvCounter, vCount);setCountColor(color);setMinEms(ems);tvCounter.setOnClickListener(this);}/*** 设置右边控件的背景颜色** @param color*/public void setCountColor(int color) {if (color != -1) {tvCounter.setBackgroundResource(color);}}public void setTvCounterEnable(boolean isEnable){tvCounter.setEnabled(isEnable);}/*** 设置左边控件文本** @param label*/public void setLabel(String label) {if (!TextUtils.isEmpty(label)) {tvLabel.setText(label);}}/*** 设置EditText hint** @param hint*/public void setEditHint(String hint) {if (!TextUtils.isEmpty(hint)) {etEdit.setHint(hint);}}/*** 设置EditText 文本** @param edit*/public void setEditText(String edit) {if (!TextUtils.isEmpty(edit)) {etEdit.setText(edit);etEdit.setSelection(edit.length());}}/*** 设置右边控件文本** @param counter*/public void setCountText(String counter) {if (!TextUtils.isEmpty(counter)) {tvCounter.setText(counter);}}/*** 设置输入文本类型** @param type*/public void setInputType(int type) {etEdit.setInputType(type);}/*** 设置倒计时时长** @param time*/public void setTime(long time) {if (time > 0) {mTime = time;}}/*** 设置倒计时时间间隔** @param interval*/public void setInterval(long interval) {if (interval > 0) {mInterval = interval;}}/*** 设置右边控件的显示与隐藏* <p>0:显示</p>* <p>1:隐藏</p>* <p>2:隐藏,但控件还是占有空间</p>** @param v*/public void setCountVisibility(View view, int v) {if (v > 0) {switch (v) {case 0:view.setVisibility(VISIBLE);break;case 1:view.setVisibility(GONE);break;case 2:view.setVisibility(INVISIBLE);break;default:view.setVisibility(VISIBLE);break;}}}/*** 获取EditText文本** @return*/public String getText() {Editable editable = etEdit.getText();if (null == editable || TextUtils.isEmpty(editable.toString())) {return "";}return editable.toString();}public void setTextType() {}@Overridepublic void onClick(View v) {int id = v.getId();if (id == R.id.lev_count) {if (null != mListener) {mListener.onRightClick();}if (null == mCountDown) {mCountDown = new CountDown(getContext(), mTime, mInterval, tvCounter, 0, 0, 0);}mCountDown.start();}}public void setMinEms(int minEms) {if (minEms > 0) {tvLabel.setMinEms(minEms);}}/*** 右边控件点击事件*/public interface IRightClickListener {void onRightClick();}
}
属性:
<declare-styleable name="MLabelEditView"><attr name="m_lev_label" format="string" /><attr name="m_lev_edit_hint" format="string" /><attr name="m_lev_count" format="string" /><attr name="m_lev_edit" format="string" /><attr name="m_lev_count_visibilty"><enum name="visiable" value="0" /><enum name="gone" value="1" /><enum name="invisiable" value="2" /></attr><attr name="m_lev_label_visibilty"><enum name="visiable" value="0" /><enum name="gone" value="1" /><enum name="invisiable" value="2" /></attr><attr name="m_lev_count_color" format="reference" /><attr name="m_lev_ems" format="integer" /></declare-styleable>
当然还需要倒计时:
package com.morse.library.utils;import android.content.Context;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;/*** 倒计时工具类** @company:大后天* @Author:曾明* @Time:2017/8/23 21:06* @Description:*/
public class CountDown extends CountDownTimer {private Context mContext;private View mView;private int mColor;private int mText;private int mFinishText;/*** 倒计时** @param context* @param millisInFuture 倒计时时长* @param countDownInterval 倒计时时间间隔* @param view 倒计时控件* @param color 控件颜色* @param text 倒计时开始之后显示的文本* @param finishText 倒计时结束之后显示的文本*/public CountDown(Context context, long millisInFuture, long countDownInterval, View view, int color, int text, int finishText) {super(millisInFuture, countDownInterval);mContext = context;mView = view;mColor = color;mText = text;mFinishText = finishText;}public CountDown(Context context, long millisInFuture, long countDownInterval, View view, int text, int finishText) {this(context, millisInFuture, countDownInterval, view, -1, text, finishText);}@Overridepublic void onTick(long millisUntilFinished) {if (mView instanceof TextView || mView instanceof Button) {mView.setClickable(false);if (mColor > 0) {mView.setBackgroundColor(mContext.getResources().getColor(mColor));}if (mText <= 0) {return;}mView.setTag(mContext.getResources().getString(mText, millisUntilFinished / 1000));}}@Overridepublic void onFinish() {if (mView instanceof TextView || mView instanceof Button) {mView.setClickable(true);if (mColor > 0) {mView.setBackgroundColor(mContext.getResources().getColor(mColor));}if (mFinishText <= 0) {return;}mView.setTag(mContext.getResources().getString(mFinishText));}}
}
注释已经很详细,具体的我就不再啰嗦了。希望对各位有所帮助。
Android自定义控件——获取验证码倒计时相关推荐
- Android实现获取验证码的倒计时功能
开发中经常会遇到获取短信验证码,获取验证码后需要等待1分钟倒计时,这段时间是不能再次发送短信请求的. 实现如下: CountDownTimerUtils.java package com.zhw.my ...
- android 获取验证码倒计时
在开发时,登陆注册时必有的模块,下面是记录一下注册时获取验证码的方法:效果图如下: 获取验证码后,进入倒计时并且是不可点击的状态. 1.复制下面工具类到项目中 import android.graph ...
- vue 获取验证码倒计时组件
之前写过一个计时函数,有计算误差,但是验证码的60秒倒计时可以忽略这一点点误差.直接上代码. <template><div class="captcha-row" ...
- Axure9 实现点击获取验证码倒计时功能
此文章帮助大家实现App的点击获取验证码的倒计时功能. 1:创建按钮和全局变量: 拖入一个矩形,创建全局变量Time=60. 在项目里面就可以找到创建全局变量的地方. 2:添加点击事件: (1):添加 ...
- VUE定时器,用于登陆获取验证码倒计时
第一步 在当前的按钮中添加@click 事件,并在按钮内文字后面加上变量,并用v-if进行判断,看秒数是否大于0 并且添加disabled,当second>0的时候给它disabled掉. 第二 ...
- jQuery 点击获取验证码,倒计时30秒
//HTML: <div class="layui-form-item"> <input class="layui-yanzheng" ...
- js 获取验证码倒计时
1 html 部分 <text :disabled="disabled" @click="getCode">{{ btntext }}</te ...
- Flutter获取验证码倒计时按钮
在Flutter中,有一个定时器类Timer,使用方法: Timer timer = new Timer(new Duration(milliseconds: 60), (){//倒计时结束执行}); ...
- 微信小程序获取验证码倒计时
实现效果图 使用方法: setInterval demo:(如果对 setInterval不了解的可以先百度下) xml 中写一个按钮: <view class="container& ...
最新文章
- CashTippr:比特币现金MoneyButton打赏插件
- spring mvc logback
- SAP BAPI的一些初级资料
- 数学之美 系列九 -- 如何确定网页和查询的相关性
- emq+mysql设置_EMQ--添加mysql认证及mysql插件访问控制
- unittest里discover用法_unittest框架核心要素及应用
- 糖果浏览器和139邮箱巧妙应用:将网页文字一键发送到手机上
- 页面滚动事件无效小记
- 易语言窗口c_句柄取进程名,易语言窗口句柄取进程文件名源码
- 页面搭建工具总结及扩展架构思考
- 总结过去10年的程序员生涯
- Matlab使用for循环实现5阶乘和的计算
- 互联网公司的裁员,能玩出多少种花样?
- 微信小程序聊天功能 WebSocket 实现发送文字,图片,语音以及WebSocket 常见问题解决方案
- 红米9A成功root.9秒解锁BL MIUI12 root权限刷 Magisk面具 TWRP
- 微信小程序开发案例2---省市区信息选择
- 人工智能专家系统c语言,人工智能实验4三-专家系统.doc
- 一文读懂新华三引领Wi-Fi 6市场的秘密
- 做一件事如何突破「擅长」达到「精通」
- Spring整合Quartz集群部署