带一键删除的EditText

来源:互联网 发布:windows系统更新失败 编辑:程序博客网 时间:2024/05/21 17:47

通过重写EditText实现对EditText文本变化的监听以及一键清楚功能


下面直接附上代码:

第一部分:重写EditText
import android.content.Context;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.text.Editable;import android.text.TextWatcher;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.View.OnFocusChangeListener;import android.view.animation.Animation;import android.view.animation.CycleInterpolator;import android.view.animation.TranslateAnimation;import android.widget.EditText;public class CustomEditText extends EditText implements        OnFocusChangeListener, TextWatcher {        private Drawable mClearDrawable = null;        private boolean mHasFoucs = false;    public CustomEditText(Context context) {        this(context, null);    }    public CustomEditText(Context context, AttributeSet attrs) {        this(context, attrs, android.R.attr.editTextStyle);    }    public CustomEditText(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();    }    private void init() {        //获取EditText的DrawableRight,如果没有设置默认为icon的paddingRight        mClearDrawable = getCompoundDrawables()[2];        if (mClearDrawable == null) {            mClearDrawable = getResources().getDrawable(R.drawable.emotionstore_progresscancelbtn);        }        mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());        //icon默认为隐藏        setClearIconVisible(false);        setOnFocusChangeListener(this);        addTextChangedListener(this);    }    /**     * 用户计算按下位置EditText的宽度 - 图标到控件右边的间距 - 图标的宽度  和     * EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,     * 未考虑竖直方向     */    @Override    public boolean onTouchEvent(MotionEvent event) {        if (event.getAction() == MotionEvent.ACTION_UP) {            if (getCompoundDrawables()[2] != null) {                boolean touchableX = event.getX() > (getWidth() - getTotalPaddingRight())                        && (event.getX() < ((getWidth() - getPaddingRight())));                //获取删除图标的边界                Rect rect = mClearDrawable.getBounds();                //获取删除图标的高度                int height = rect.height();                int y = (int) event.getY();                //计算图标底部到控件底部的距离                int distance = (getHeight() - height) / 2;                //判断触摸点是否在竖直范围内(可能会有点误差)                //触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标                boolean isInnerHeight = (y > distance) && (y < (distance + height));                if (touchableX && isInnerHeight) {                    this.setText("");                }            }        }        return super.onTouchEvent(event);    }    /**     * 监听文本变化,判断是否显示清楚icon     */    @Override    public void onFocusChange(View v, boolean hasFocus) {        this.mHasFoucs = hasFocus;        if (hasFocus) {            setClearIconVisible(getText().length() > 0);        } else {            setClearIconVisible(false);        }    }    /**     * 设置清除icon的显示与隐藏     * @param visible     */    protected void setClearIconVisible(boolean visible) {        Drawable right = visible ? mClearDrawable : null;        setCompoundDrawables(getCompoundDrawables()[0],                getCompoundDrawables()[1], right, getCompoundDrawables()[3]);    }    /**     * 设置清空icon     * */    public void setClearDrawable(Drawable drawable) {        try {            this.mClearDrawable = drawable;            setClearIconVisible(this.getText().length() > 0);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 监听文本变化情况     */    @Override    public void onTextChanged(CharSequence s, int start, int count,                              int after) {        if (mHasFoucs) {            setClearIconVisible(s.length() > 0);        }    }    @Override    public void beforeTextChanged(CharSequence s, int start, int count,                                  int after) {    }    @Override    public void afterTextChanged(Editable s) {    }    /**     * 设置晃动     */    public void setShakeAnimation() {        this.setAnimation(shakeAnimation(5));    }    public static Animation shakeAnimation(int counts) {        Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);        translateAnimation.setInterpolator(new CycleInterpolator(counts));        translateAnimation.setDuration(1000);        return translateAnimation;    }} 
第二部分:attr.xml
<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="CircleImageView">        <attr name="border_width" format="dimension" />        <attr name="border_color" format="color" />    </declare-styleable></resources>


0 0