自定义EditText_password输入框

来源:互联网 发布:java程序设计流程图 编辑:程序博客网 时间:2024/06/05 23:05
创建一个类继承EditTextimport android.annotation.SuppressLint;import android.content.Context;import android.graphics.drawable.Drawable;import android.support.v4.content.ContextCompat;import android.text.Editable;import android.text.Selection;import android.text.Spannable;import android.text.TextWatcher;import android.text.method.HideReturnsTransformationMethod;import android.text.method.PasswordTransformationMethod;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.Animation;import android.view.animation.CycleInterpolator;import android.view.animation.TranslateAnimation;import android.widget.EditText;import com.example.ztz.android_timer.R;/** * Created by ztz on 2017/12/19. * 自定义EditText_password输入框 */@SuppressLint("AppCompatCustomView")public class PasswordEditText extends EditText implements View.OnFocusChangeListener, TextWatcher {    private Drawable mToggleDrawable;    public PasswordEditText(Context context) {        super(context);    }    public PasswordEditText(Context context, AttributeSet attrs) {        super(context, attrs);        init();        //进入页面默认设置密文格式        setTransformationMethod(PasswordTransformationMethod.getInstance());    }    public PasswordEditText(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();        //进入页面默认设置密文格式        setTransformationMethod(PasswordTransformationMethod.getInstance());    }    /**     * 初始化小眼睛控件     */    private void init() {        //获取EditText的DrawableRight,主要是通过xml或者外部设置右边的按钮,如果没有设置就采用默认的        mToggleDrawable = getCompoundDrawables()[2];        if (mToggleDrawable == null) {            mToggleDrawable = ContextCompat.getDrawable(getContext(), R.drawable.zhengyan);        }        mToggleDrawable.setBounds(0, 0, mToggleDrawable.getIntrinsicWidth(), mToggleDrawable.getIntrinsicHeight());        setToggleIconVisible(false);        setOnFocusChangeListener(this);        addTextChangedListener(this);    }    /**     * 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件     * 当我们按下的位置 在  EditText的宽度 - 图标到控件右边的间距 - 图标的宽度  和     * EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向没有考虑     */    @Override    public boolean onTouchEvent(MotionEvent event) {        if (getCompoundDrawables()[2] != null) {            if (event.getAction() == MotionEvent.ACTION_DOWN) {                boolean touchable = event.getX() > (getWidth()                        - getPaddingRight() - mToggleDrawable.getIntrinsicWidth())                        && (event.getX() < ((getWidth() - getPaddingRight())));                if (touchable) {                    //显示密码明文                    setTransformationMethod(HideReturnsTransformationMethod.getInstance());                    postInvalidate();                    CharSequence charSequence = getText();                    //为了保证体验效果,需要保持输入焦点在文本最后一位                    if (charSequence != null) {                        Spannable spanText = (Spannable) charSequence;                        Selection.setSelection(spanText, charSequence.length());                    }                }            }else if(event.getAction() == MotionEvent.ACTION_UP){                //隐藏密码明文                setTransformationMethod(PasswordTransformationMethod.getInstance());                postInvalidate();                setSelection(getText().length());            }        }        return super.onTouchEvent(event);    }    /**     * 当EditText焦点发生变化的时候,判断里面字符串长度设置图标的显示与隐藏     */    @Override    public void onFocusChange(View v, boolean hasFocus) {        if (hasFocus) {            setToggleIconVisible(getText().length() > 0);        } else {            setToggleIconVisible(false);        }    }    /**     * 设置图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去     * @param visible     */    public void setToggleIconVisible(boolean visible) {        Drawable right = visible ? mToggleDrawable : null;        setCompoundDrawables(getCompoundDrawables()[0],                getCompoundDrawables()[1], right, getCompoundDrawables()[3]);    }    /**     * 当输入框里面内容发生变化的时候回调的方法     */    @Override    public void onTextChanged(CharSequence s, int start, int count,int after) {        setToggleIconVisible(s.length() > 0);    }    @Override    public void beforeTextChanged(CharSequence s, int start, int count,int after) {    }    @Override    public void afterTextChanged(Editable s) {    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 门上有人做记号怎么办 颜料粘上衣服洗不掉怎么办 半夜有小偷开锁怎么办 幼儿园人数较多怎么办 附近幼儿园拖班招满了怎么办 6个月大宝宝拉肚子怎么办 婴儿容易吐奶怎么办 新生儿睡眠时间颠倒怎么办 婴儿睡觉黑白颠倒怎么办 婴儿黑白颠倒了怎么办 宝宝肠粘膜受损怎么办 dnf会卡换装怎么办? 孩子不讲理蛮横怎么办 孩子不爱上学了怎么办 幼儿园孩子不爱上学怎么办 额头撞肿了怎么办 两岁半宝宝说话晚怎么办 1岁宝宝拉肚子怎么办? 小孩嗓子老哑怎么办 小孩嗓子经常哑怎么办 小孩子一年级成绩差怎么办 小孩子一年级学习成绩差怎么办 楼上有孩子扰民怎么办 隔壁小孩太吵怎么办 楼上孩子太吵怎么办 泰国贴纸签小孩怎么办 六个月宝宝近视怎么办 孩子视力低应该怎么办 儿童视力低常怎么办 视力储备值低怎么办 六个月宝宝远视怎么办 婴儿喜欢舔衣服怎么办 一岁半宝宝抵抗力差怎么办 两个月宝宝打嗝怎么办 衣服买大一码怎么办 8岁儿童头汗多怎么办 新生儿肛门红了怎么办 40天新生儿发烧怎么办 十天婴儿发烧怎么办 宝宝发烧37.3度怎么办 小孩发烧37.2度怎么办