package com.doumee.lib_coremodel.view; import android.content.Context; import android.content.res.TypedArray; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.doumee.lib_coremodel.R; import com.doumee.lib_coremodel.util.DpOrSp2PxUtil; import java.util.ArrayList; import java.util.List; /** * 类:PhoneCode * 作者: qxc * 日期:2018/3/14. */ public class PhoneCode extends RelativeLayout { private Context context; private TextView tv_code1; private TextView tv_code2; private TextView tv_code3; private TextView tv_code4; private View v1; private View v2; private View v3; private View v4; private EditText et_code; private List codes = new ArrayList<>(); private InputMethodManager imm; private int textColorNormal; private int textColor; private int lineColorNormal; private int lineColor; private int d = 0; public PhoneCode(Context context) { super(context); this.context = context; loadView(); } public PhoneCode(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.PhoneCode); textColorNormal = ta.getColor(R.styleable.PhoneCode_textColorNormal,0xffE5E5E5 ); textColor = ta.getColor(R.styleable.PhoneCode_textColor, 0xff70D0D2); lineColorNormal = ta.getColor(R.styleable.PhoneCode_lineColorNormal, textColorNormal); lineColor = ta.getColor(R.styleable.PhoneCode_lineColor, textColor); d = DpOrSp2PxUtil.dp2pxConvertInt(getContext(),1); loadView(); } private void loadView(){ imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); View view = LayoutInflater.from(context).inflate(R.layout.phone_code, this); initView(view); initEvent(); } private void initView(View view){ tv_code1 = (TextView) view.findViewById(R.id.tv_code1); tv_code2 = (TextView) view.findViewById(R.id.tv_code2); tv_code3 = (TextView) view.findViewById(R.id.tv_code3); tv_code4 = (TextView) view.findViewById(R.id.tv_code4); et_code = (EditText) view.findViewById(R.id.et_code); v1 = view.findViewById(R.id.v1); v2 = view.findViewById(R.id.v2); v3 = view.findViewById(R.id.v3); v4 = view.findViewById(R.id.v4); tv_code1.setTextColor(textColor); tv_code2.setTextColor(textColor); tv_code3.setTextColor(textColor); tv_code4.setTextColor(textColor); } private void initEvent(){ //验证码输入 et_code.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { if(editable != null && editable.length()>0) { et_code.setText(""); if(codes.size() < 4){ codes.add(editable.toString()); showCode(); } } } }); // 监听验证码删除按键 et_code.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { if (keyCode == KeyEvent.KEYCODE_DEL && keyEvent.getAction() == KeyEvent.ACTION_DOWN && codes.size()>0) { codes.remove(codes.size()-1); showCode(); return true; } return false; } }); } /** * 显示输入的验证码 */ private void showCode(){ String code1 = ""; String code2 = ""; String code3 = ""; String code4 = ""; if(codes.size()>=1){ code1 = codes.get(0); } if(codes.size()>=2){ code2 = codes.get(1); } if(codes.size()>=3){ code3 = codes.get(2); } if(codes.size()>=4){ code4 = codes.get(3); } tv_code1.setText(code1); tv_code2.setText(code2); tv_code3.setText(code3); tv_code4.setText(code4); setColor();//设置高亮颜色 callBack();//回调 } public void clearCode(){ codes.clear(); showCode(); } /** * 设置高亮颜色 */ private void setColor(){ v1.setBackgroundColor(lineColorNormal); v2.setBackgroundColor(lineColorNormal); v3.setBackgroundColor(lineColorNormal); v4.setBackgroundColor(lineColorNormal); if(codes.size()==1){ v1.setBackgroundColor(lineColor); } if(codes.size()==2){ v1.setBackgroundColor(lineColor); v2.setBackgroundColor(lineColor); } if(codes.size()==3){ v1.setBackgroundColor(lineColor); v2.setBackgroundColor(lineColor); v3.setBackgroundColor(lineColor); } if(codes.size()>=4){ v1.setBackgroundColor(lineColor); v2.setBackgroundColor(lineColor); v3.setBackgroundColor(lineColor); v4.setBackgroundColor(lineColor); } setBlod(v1,codes.size()>0); setBlod(v2,codes.size()>1); setBlod(v3,codes.size()>2); setBlod(v4,codes.size()>3); } private void setBlod(View v,boolean isBlod){ LinearLayout.LayoutParams params= (LinearLayout.LayoutParams) v.getLayoutParams(); params.height = d * (isBlod?3:1); v.setLayoutParams(params); } public void etRequestFocus(){ et_code.requestFocus(); showSoftInput(); } /** * 回调 */ private void callBack(){ if(onInputListener==null){ return; } if(codes.size()==4){ onInputListener.onSucess(getPhoneCode()); }else{ onInputListener.onInput(); } } //定义回调 public interface OnInputListener{ void onSucess(String code); void onInput(); } private OnInputListener onInputListener; public void setOnInputListener(OnInputListener onInputListener){ this.onInputListener = onInputListener; } /** * 显示键盘 */ public void showSoftInput(){ //显示软键盘 if(imm!=null && et_code!=null) { et_code.postDelayed(new Runnable() { @Override public void run() { imm.showSoftInput(et_code, 0); } },200); } } /** * 获得手机号验证码 * @return 验证码 */ public String getPhoneCode(){ StringBuilder sb = new StringBuilder(); for (String code : codes) { sb.append(code); } return sb.toString(); } }