| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- package com.hjq.widget;
- import android.annotation.SuppressLint;
- import android.content.Context;
- import android.graphics.drawable.Drawable;
- import android.support.v4.content.ContextCompat;
- import android.support.v4.graphics.drawable.DrawableCompat;
- import android.text.Editable;
- import android.text.InputType;
- import android.text.TextWatcher;
- import android.util.AttributeSet;
- import android.view.MotionEvent;
- import android.view.View;
- /**
- * Created by Android Studio.
- * User: zbb
- * Date: 2019/12/30
- * Describe: PasswordEditText 密码隐藏显示的EditText
- */
- public class PasswordEditText extends RegexEditText
- implements View.OnTouchListener,
- View.OnFocusChangeListener, TextWatcher {
- private static final int TYPE_VISIBLE = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
- private static final int TYPE_INVISIBLE = InputType.TYPE_TEXT_VARIATION_PASSWORD;
- private Drawable mCurrentDrawable;
- private Drawable mVisibleDrawable;
- private Drawable mInvisibleDrawable;
- private OnTouchListener mOnTouchListener;
- private OnFocusChangeListener mOnFocusChangeListener;
- public PasswordEditText(Context context) {
- super(context);
- }
- public PasswordEditText(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public PasswordEditText(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
- @SuppressWarnings("all")
- @SuppressLint("ClickableViewAccessibility")
- @Override
- protected void initialize(Context context, AttributeSet attrs) {
- super.initialize(context, attrs);
- // Wrap the drawable so that it can be tinted pre Lollipop
- mVisibleDrawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_input_show));
- mVisibleDrawable.setBounds(0, 0, mVisibleDrawable.getIntrinsicWidth(), mVisibleDrawable.getIntrinsicHeight());
- mInvisibleDrawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_input_hide));
- mInvisibleDrawable.setBounds(0, 0, mInvisibleDrawable.getIntrinsicWidth(), mInvisibleDrawable.getIntrinsicHeight());
- mCurrentDrawable = mVisibleDrawable;
- // 密码不可见
- addInputType(TYPE_INVISIBLE);
- if (getInputRegex() == null) {
- // 密码输入规则
- setInputRegex(REGEX_NONNULL);
- }
- setDrawableVisible(false);
- super.setOnTouchListener(this);
- super.setOnFocusChangeListener(this);
- super.addTextChangedListener(this);
- }
- private void setDrawableVisible(final boolean visible) {
- if (mCurrentDrawable.isVisible() == visible) {
- return;
- }
- mCurrentDrawable.setVisible(visible, false);
- final Drawable[] drawables = getCompoundDrawables();
- setCompoundDrawables(
- drawables[0],
- drawables[1],
- visible ? mCurrentDrawable : null,
- drawables[3]);
- }
- private void refreshDrawableStatus() {
- final Drawable[] drawables = getCompoundDrawables();
- setCompoundDrawables(
- drawables[0],
- drawables[1],
- mCurrentDrawable,
- drawables[3]);
- }
- @Override
- public void setOnFocusChangeListener(final OnFocusChangeListener onFocusChangeListener) {
- mOnFocusChangeListener = onFocusChangeListener;
- }
- @Override
- public void setOnTouchListener(final OnTouchListener onTouchListener) {
- mOnTouchListener = onTouchListener;
- }
- /**
- * {@link OnFocusChangeListener}
- */
- @Override
- public void onFocusChange(final View view, final boolean hasFocus) {
- if (hasFocus && getText() != null) {
- setDrawableVisible(getText().length() > 0);
- } else {
- setDrawableVisible(false);
- }
- if (mOnFocusChangeListener != null) {
- mOnFocusChangeListener.onFocusChange(view, hasFocus);
- }
- }
- /**
- * {@link OnTouchListener}
- */
- @Override
- public boolean onTouch(final View view, final MotionEvent motionEvent) {
- final int x = (int) motionEvent.getX();
- if (mCurrentDrawable.isVisible() && x > getWidth() - getPaddingRight() - mCurrentDrawable.getIntrinsicWidth()) {
- if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
- if (mCurrentDrawable == mVisibleDrawable) {
- mCurrentDrawable = mInvisibleDrawable;
- // 密码可见
- removeInputType(TYPE_INVISIBLE);
- addInputType(TYPE_VISIBLE);
- refreshDrawableStatus();
- } else if (mCurrentDrawable == mInvisibleDrawable) {
- mCurrentDrawable = mVisibleDrawable;
- // 密码不可见
- removeInputType(TYPE_VISIBLE);
- addInputType(TYPE_INVISIBLE);
- refreshDrawableStatus();
- }
- Editable editable = getText();
- if (editable != null) {
- setSelection(editable.toString().length());
- }
- }
- return true;
- }
- return mOnTouchListener != null && mOnTouchListener.onTouch(view, motionEvent);
- }
- /**
- * {@link TextWatcher}
- */
- @Override
- public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
- if (isFocused()) {
- setDrawableVisible(s.length() > 0);
- }
- }
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
- @Override
- public void afterTextChanged(Editable s) {}
- }
|