1. 程式人生 > >Android 仿愛奇藝驗證碼輸入框

Android 仿愛奇藝驗證碼輸入框

效果:


因為程式碼量不少,直接放Activity裡面肯定不合適,就抽取成一個自定義控制元件了

這樣以後複用也比較方便,但是我很菜,寫的自定義控制元件也是很菜的那種...湊活湊活吧

public class CodeView extends LinearLayout implements View.OnFocusChangeListener{
    private static final int codeCount = 5;
    private List<EditText> editTextList;
    private int currentIndex;
    private InputListener listener;

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        currentIndex = (int) v.getTag();
    }

    public interface InputListener {
        void onLastOneInputed(String text);
    }

    public void setInputListener(InputListener listener) {
        this.listener = listener;
    }

    public CodeView(Context context) {
        this(context, null);
    }

    public CodeView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CodeView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        setBackgroundColor(Color.WHITE);
        editTextList = new ArrayList<>();
        post(new Runnable() {
            @Override
            public void run() {

                int size = getMeasuredWidth() / codeCount;
                LinearLayout.LayoutParams editTextParams = new LinearLayout.LayoutParams(0, size, 1);
                LinearLayout.LayoutParams lineParam = new LinearLayout.LayoutParams(1, size);
                for(int i = 0; i < codeCount; i++) {
                    EditText editText = new EditText(getContext());

                    editText.addTextChangedListener(watcher);
                    editTextList.add(editText);
                    editText.setText("");

                    editText.setInputType(InputType.TYPE_CLASS_NUMBER);
                    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(1)});
                    editText.setMaxLines(1);
                    editText.setBackgroundColor(Color.WHITE);
                    editText.setTextColor(Utils.getColor(R.color.textcolor_strong));
                    editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
                    editText.setGravity(Gravity.CENTER);

                    addView(editText, editTextParams);

                    if(i != codeCount - 1) {
                        View line = new View(getContext());
                        line.setBackgroundColor(Color.parseColor("#ebebeb"));
                        addView(line, lineParam);
                    }

                    editText.setTag(i);
                    editText.setOnFocusChangeListener(CodeView.this);
                }
                editTextList.get(0).requestFocus();
            }
        });
    }

    private TextWatcher watcher = new TextWatcher() {
        @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(isFinished()) {
                Utils.showToast(getText(), 0);
                if(listener != null) {
                    listener.onLastOneInputed(getText());
                }
            } else {
                if (s.length() == 1) {
                    if (currentIndex != editTextList.size() - 1) {
                        currentIndex++;
                        EditText editText = editTextList.get(currentIndex);
                        editText.requestFocus();
                    }
                }
            }
        }


    };

    private boolean isFinished() {
        for(EditText editText : editTextList) {
            if(TextUtils.isEmpty(editText.getText().toString())) {
                return false;
            }
        }
        return true;
    }

    public String getText() {
        StringBuffer sb = new StringBuffer();
        for(EditText editText : editTextList) {
            sb.append(editText.getText().toString());
        }
        return sb.toString();
    }

    public void clear() {
        for(EditText editText : editTextList) {
            editText.setText("");
        }
    }
}