先上图,在网上看了一些,大家都是手动画每一个验证码的输入框然后一个个添加,并且实现每一个输入框的监听,不仅维护起来麻烦,而且代码不美观,在这里推荐一个比较好用既可以设置不同样式的输入框,这里我监听了验证码输入的长度,当长度等于6的时候,按钮可以点击,这里验证码的长度可以自定义!
build.gradle文件中
dependencies {
compile 'com.alimuzaffar.lib:pinentryedittext:1.3.3'
}
PinEntryEditText特征
- 引脚字符数是可配置的。您可以使用该
maxLength
属性定义您想要的引脚长度。 - PinEntryEditText,支持文本动画。
- 允许您指定要用作输入掩码的任何unicode字符。
- 指定drawable作为前景/背景。
PinEntryEditText属性
- app:pinBackgroundDrawable=" "
- app:pinAnimationType=" "
- app:pinCharacterMask=" "
- app:pinSingleCharHint=" "
- app:pinTextBottomPadding=" "
- app:pinLineStroke=" "
- app:pinLineStrokeSelected=" "
- app:pinBackgroundIsSquare=""
- app:pinLineColors=" "
简单的介绍了一下PinEntryEdutText特征,一些简单的属性会在我们的布局文件中,现在贴一下代码
布局文件:activity_inputcode.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
android:orientation="vertical">
<!--返回按钮-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="19dp"
android:layout_marginLeft="20dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/inputcode_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/zhaohui_cha"/>
</LinearLayout>
<!--请输入验证码-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="69dp"
android:layout_marginLeft="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center|left"
android:text="请输入验证码"
android:textSize="25dp"
android:textColor="#464646"/>
</LinearLayout>
<!--验证码已发送到您的手机-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:layout_marginLeft="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center|left"
android:text="验证码已发送到您的手机"
android:textSize="14sp"
android:textColor="#989898"/>
</LinearLayout>
<!--电话号码-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center|left"
android:text="+86"
android:textSize="14sp"
android:textColor="#989898"/>
<TextView
android:id="@+id/inputcode_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:gravity="center|left"
android:text=""
android:textSize="14sp"
android:textColor="#989898"/>
</LinearLayout>
<!--6位数字验证码,倒计时-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="45dp"
android:layout_marginLeft="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center|left"
android:text="6位数字验证码"
android:textSize="14sp"
android:textColor="#989898"/>
<TextView
android:id="@+id/inputcode_time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="20dp"
android:textColor="#ff0000"
android:text="60s"
android:textSize="14sp" />
</LinearLayout>
<!--验证码-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="15dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:orientation="horizontal">
<com.alimuzaffar.lib.pin.PinEntryEditText
android:id="@+id/inputcode_editlinear"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cursorVisible="false"
android:digits="1234567890"
android:inputType="number"
android:maxLength="6"
android:textIsSelectable="false"
android:textSize="19sp"
android:textColor="#292929"
android:gravity="center"
android:layout_gravity="center"
app:pinBackgroundIsSquare="true"
app:pinBackgroundDrawable="@drawable/zhaohui_mask"/>
</LinearLayout>
<!--下一步-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="80dp"
android:layout_marginLeft="35dp"
android:layout_marginRight="35dp"
android:orientation="horizontal">
<Button
android:id="@+id/inputcode_next"
android:enabled="false"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:gravity="center"
android:background="@drawable/shape_noclick"
android:text="下一步"
android:textSize="16sp"
android:textColor="#ffffff" />
</LinearLayout>
</LinearLayout>zh
上面验证码输入框我添加的背景是一张图片,当然可以自己画布局引用,图片可以直接拿去用
下一步按钮中引用了两个样式文件,分别显示按钮可点击时的颜色和不可点击时的颜色(默认按钮不可点击),两个布局文件唯一的区别在于按钮的颜色,之所有写两个对我别的地方有用 处,所以别太介意,😂drawable文件夹下面分别创建不同的xml
shape_noclick.xml 用于控制按钮不可以点击时样式
<?xml version="1.0" encoding="UTF-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#778ad2" />
<corners android:radius="5dip" />
<padding
android:left="10dp"
android:top="10dp"
android:right="10dp"
android:bottom="10dp"
/>
</shape>
shape_button.xml 用于控制按钮可点击时样式
<?xml version="1.0" encoding="UTF-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#334484" />
<corners android:radius="5dip" />
<padding
android:left="10dp"
android:top="10dp"
android:right="10dp"
android:bottom="10dp"/>
</shape>
SecurityCodeActivity.class
/**
* Created by YyyyQ on 2018/8/31.
* 自定义验证码样式
*/
public class SecurityCodeActivity extends AppCompatActivity {
//黄油刀(自行百度)
@Bind(R.id.inputcode_back)
ImageView inputcodeBack;
@Bind(R.id.inputcode_phone)
TextView inputcodePhone;
@Bind(R.id.inputcode_time)
TextView inputcodeTime;
@Bind(R.id.inputcode_editlinear)
PinEntryEditText inputcodeEditlinear;
@Bind(R.id.inputcode_next)
Button inputcodeNext;
//验证码重新发送剩余时间
private long laveTime;
//验证码
private String code;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_inputcode);
ButterKnife.bind(this);
//用户电话赋值
inputcodePhone.setText("131********");
//设置输入框监听
inputcodeEditlinear.addTextChangedListener(new EditChangedListener());
//倒计时
laveTime=60000;
CountDownTimerUtils mCountDownTimerUtils = new CountDownTimerUtils(inputcodeTime, laveTime, 1000);
mCountDownTimerUtils.start();
}
@OnClick({R.id.inputcode_back, R.id.inputcode_time, R.id.inputcode_next})
public void onViewClicked(View view) {
switch (view.getId()) {
//返回
case R.id.inputcode_back:
finish();
break;
//下一步
case R.id.inputcode_next:
Toast.makeText(this,code,Toast.LENGTH_SHORT).show();
break;
//重新获取验证码
case R.id.inputcode_time:
Toast.makeText(this,"重新获取验证码",Toast.LENGTH_SHORT).show();
//重新开始倒计时
laveTime=60000;
CountDownTimerUtils mCountDownTimerUtils = new CountDownTimerUtils(inputcodeTime, laveTime, 1000);
mCountDownTimerUtils.start();
break;
}
}
/**
* 设置EditText监听
*/
class EditChangedListener implements TextWatcher {
private final int charMaxNum = 6;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
code = s.toString();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(s.toString().length()==charMaxNum){
inputcodeNext.setEnabled(true);
inputcodeNext.setBackgroundResource(R.drawable.shape_button);
}else{
inputcodeNext.setBackgroundResource(R.drawable.shape_noclick);
inputcodeNext.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable s) {
if(s.toString().length()==charMaxNum){
inputcodeNext.setEnabled(true);
inputcodeNext.setBackgroundResource(R.drawable.shape_button);
code=s.toString();
}else{
inputcodeNext.setBackgroundResource(R.drawable.shape_noclick);
inputcodeNext.setEnabled(false);
}
}
}
/**
* 时间倒计时
*/
class CountDownTimerUtils extends CountDownTimer {
private TextView mTextView;
public CountDownTimerUtils(TextView textView, long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
this.mTextView = textView;
}
@Override
public void onTick(long l) {
mTextView.setClickable(false); //设置不可点击
mTextView.setText(l / 1000 + "s"); //设置倒计时时间
SpannableString spannableString = new SpannableString(mTextView.getText().toString());
ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(span, 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);
}
@Override
public void onFinish() {
mTextView.setClickable(true);//重新获得点击
mTextView.setText("重新发送");
}
}
}
ok!一个验证码自定义样式就这么简单🎉