Android系统自带的EditText总的来说,功能相对简单,不能满足产品与UI的奇思妙想的功能(逃),
所以我们势必要对输入框功能进行一定的拓展,这次我们来实现一键清除输入内容的功能,毕竟不能
让用户一直按着删除键来删除吧(我觉着很有道理),以及输入内容有误时输入框震动功能(其实就是
所以我们势必要对输入框功能进行一定的拓展,这次我们来实现一键清除输入内容的功能,毕竟不能
让用户一直按着删除键来删除吧(我觉着很有道理),以及输入内容有误时输入框震动功能(其实就是
平移动画),不多说,上效果图和代码。
public class ClearWriteAndAnimaEditText
extends EditText
implements View.OnFocusChangeListener , TextWatcher {
/**
* 删除按钮
*/
private Drawable mClearDrawable;
public ClearWriteAndAnimaEditText(Context context) {
this(context, null);
}
public ClearWriteAndAnimaEditText(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.editTextStyle);
}
public ClearWriteAndAnimaEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mClearDrawable = getResources().getDrawable(R.drawable.pic_delete);
mClearDrawable.setBounds(0, 0,36,36);
setClearIconVisible(false);
this.setOnFocusChangeListener(this);
this.addTextChangedListener(this);
}
/**
* 当输入框里面内容发生变化的时候回调的方法
*/
@Override
public void onTextChanged(CharSequence s, int start, int count, int after) {
setClearIconVisible(s.length() > 0);
}
/**
* 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
* @param visible
*/
protected void setClearIconVisible(boolean visible) {
Drawable right = visible ? mClearDrawable : null;
setCompoundDrawables(getCompoundDrawables()[0],
getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
}
/**
* 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件
* 当我们按下的位置 在 EditText的宽度 - 图标到控件右边的间距 - 图标的宽度 和
* EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向没有考虑
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (getCompoundDrawables()[2] != null) {
if (event.getAction() == MotionEvent.ACTION_UP) {
boolean touchable = event.getX() > (getWidth()
- getPaddingRight() - mClearDrawable.getIntrinsicWidth())
&& (event.getX() < ((getWidth() - getPaddingRight())));
if (touchable) {
this.setText("");
}
}
}
return super.onTouchEvent(event);
}
/**
* 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏
*/
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
setClearIconVisible(getText().length() > 0);
} else {
setClearIconVisible(false);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
/**
* 设置晃动动画
*/
public void setShakeAnimation() {
this.startAnimation(shakeAnimation(3));
}
/**
* 晃动动画
* @param counts 半秒钟晃动多少下
* @return
*/
public static Animation shakeAnimation(int counts) {
Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);
translateAnimation.setInterpolator(new CycleInterpolator(counts));
translateAnimation.setDuration(500);
return translateAnimation;
}
public Drawable getClearDrawable() {
return mClearDrawable;
}
public void setClearDrawable(Drawable mClearDrawable) {
this.mClearDrawable = mClearDrawable;
}
}
在Xml文件进行使用,注意 Copy reference 全路径包名
<com.utils.
ClearWriteAndAnimaEditText
android:id="@+id/password_et" android:layout_width="match_parent" android:layout_height="100px" android:maxLength="11" android:maxLines="1" android:drawableLeft="@mipmap/password_icon" android:drawablePadding="10dp" android:layout_weight="1" android:paddingRight="30dp" android:background="@drawable/layout_line" android:hint="请输入密码" android:textColor="#000" android:textCursorDrawable="@null" android:textSize="14sp" />