Android自定義方形驗證碼輸入框

lvkaixuan發表於2018-09-06

  • 效果動圖

Android自定義方形驗證碼輸入框

實現思路

  • 繪製多個TextView控制元件用來顯示數字
  • 繪製隱藏EditText用來接收輸入法內容(防止部分手機或輸入法監聽不到內容)
  • 將EditText的內容顯示到TextView中

程式碼實現

  • 自定義控制元件繼承至LinearLayout

public class CodeEditView extends LinearLayout
複製程式碼

  • 繪製多個TextView並繪製方塊邊框背景用來顯示數字

for (int i = 0; i < EditViewNum; i++) {
            TextView textView = new TextView(mContext);
            textView.setBackgroundResource(R.drawable.shape_border_normal);
            textView.setGravity(Gravity.CENTER);
            textView.setTextSize(DensityUtil.sp2px(mContext,textSize));
            textView.getPaint().setFakeBoldText(true);
            textView.setLayoutParams(params);
            textView.setInputType(inputTyte);
            textView.setTextColor(textColor);
            textView.setOnClickListener(this);
            mTextViewsList.add(textView);
            addView(textView);
        }
複製程式碼

  • 繪製EditText並將背景設為透明(不讓使用者看到,僅用來監聽輸入法內容,防止部分手機或輸入法不相容)

mEditText = new EditText(context);
        mEditText.setBackgroundColor(Color.parseColor("#00000000"));
        mEditText.setMaxLines(1);
        mEditText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);
        mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(EditViewNum)});
        mEditText.addTextChangedListener(this);
        mEditText.setTextSize(0);
        addView(mEditText);
複製程式碼

  • 監聽輸入法內容進行邏輯處理

@Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}
    @Override
    public void afterTextChanged(Editable s) {
        if (callBack!=null) {
            callBack.afterTextChanged(s.toString());
        }
        if (s.length() <= 1) {
            mTextViewsList.get(0).setText(s);
        } else {
            mTextViewsList.get(mEditText.getText().length() - 1).setText(s.subSequence(s.length() - 1, s.length()));
        }
        if (s.length()==EditViewNum) {
            if (callBack!=null) {
                callBack.input(mEditText.getText().toString());
            }
        }
    }
複製程式碼

  • 當點選TextView時,將EditText獲取到焦點並彈出輸入法

    @Override
    public void onClick(View v) { //TextView點選時獲取焦點彈出輸入法
        mEditText.setFocusable(true);
        mEditText.setFocusableInTouchMode(true);
        mEditText.requestFocus();
        InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
    }
複製程式碼


Demo地址

掃碼下載apk

Android自定義方形驗證碼輸入框


相關文章