package com.xjf.repository.view; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v4.content.res.ResourcesCompat; 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; import com.xjf.repository.R; /** * @说明: 自定义带删除按钮的EditText */ public class ClearEditText extends EditText implements OnFocusChangeListener, TextWatcher { //EditText右侧的删除按钮 private Drawable mClearDrawable; private boolean hasFoucs; private Context context; public ClearEditText(Context context) { this(context, null); this.context = context; } public ClearEditText(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.editTextStyle); this.context = context; } public ClearEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; init(); } @SuppressLint("NewApi") @SuppressWarnings("deprecation") private void init() { // 获取EditText的DrawableRight,假如没有设置我们就使用默认的图片,获取图片的顺序是左上右下(0,1,2,3,) mClearDrawable = getCompoundDrawables()[2]; if (mClearDrawable == null) { mClearDrawable = ResourcesCompat.getDrawable(getResources(), R.drawable.delete_selector, null); } mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight()); // 默认设置隐藏图标 setClearIconVisible(false); // 设置焦点改变的监听 setOnFocusChangeListener(this); // 设置输入框里面内容发生改变的监听 addTextChangedListener(this); } /* @说明:isInnerWidth, isInnerHeight为ture,触摸点在删除图标之内,则视为点击了删除图标 * event.getX() 获取相对应自身左上角的X坐标 * event.getY() 获取相对应自身左上角的Y坐标 * getWidth() 获取控件的宽度 * getHeight() 获取控件的高度 * getTotalPaddingRight() 获取删除图标左边缘到控件右边缘的距离 * getPaddingRight() 获取删除图标右边缘到控件右边缘的距离 * isInnerWidth: * getWidth() - getTotalPaddingRight() 计算删除图标左边缘到控件左边缘的距离 * getWidth() - getPaddingRight() 计算删除图标右边缘到控件左边缘的距离 * isInnerHeight: * distance 删除图标顶部边缘到控件顶部边缘的距离 * distance + height 删除图标底部边缘到控件顶部边缘的距离 */ @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (getCompoundDrawables()[2] != null) { int x = (int) event.getX(); int y = (int) event.getY(); Rect rect = getCompoundDrawables()[2].getBounds(); int height = rect.height(); int distance = (getHeight() - height) / 2; boolean isInnerWidth = x > (getWidth() - getTotalPaddingRight()) && x < (getWidth() - getPaddingRight()); boolean isInnerHeight = y > distance && y < (distance + height); if (isInnerWidth && isInnerHeight) { this.setText(""); } } } return super.onTouchEvent(event); } /** * 当ClearEditText焦点发生变化的时候, * 输入长度为零,隐藏删除图标,否则,显示删除图标 */ @Override public void onFocusChange(View v, boolean hasFocus) { this.hasFoucs = hasFocus; if (hasFocus) { setClearIconVisible(getText().length() > 0); } else { setClearIconVisible(false); } } protected void setClearIconVisible(boolean visible) { Drawable right = visible ? mClearDrawable : null; setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]); } @Override public void onTextChanged(CharSequence s, int start, int count, int after) { if (hasFoucs) { 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)); } /** * 晃动动画 * * @param counts 1秒钟晃动多少下 * @return */ public static Animation shakeAnimation(int counts) { Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0); translateAnimation.setInterpolator(new CycleInterpolator(counts)); translateAnimation.setDuration(1000); return translateAnimation; } }