自定义ClearEditText用的场景还是比较多的,比如搜索框、登陆界面都可能用到,下面我们就来动手做一个!如果你看着有点吃力,建议先看我上一篇文章《Android 自定义View、ViewGroup(二)之绘制流程》
1.自定义View其中的一种形式就是继承现有的控件EditText,重写构造方法。
public ClearEditText(Context context) {
super(context);
init();
}
public ClearEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ClearEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
2.我们来看一下init方法
public void init() {
// 获取输入框上下左右组成的一个drawable数组 drawables[left, top, right,bottom]
Drawable[] drawables = this.getCompoundDrawables();
mRightDrawable = drawables[2];
// 设置获取焦点的监听
setOnFocusChangeListener(this);
// 设置文本变化的监听
addTextChangedListener(this);
setClearDrawableVisible(false);
}
3, 通过触摸的范围来确定是否点击了删除按钮
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
boolean isClean = (event.getX() > (getWidth() - getTotalPaddingRight())) && (event.getX() < (getWidth() - getPaddingRight()));
if (isClean)
setText("");
break;
}
return super.onTouchEvent(event);
}
4. 设置删除按钮的隐藏和显示
private void setClearDrawableVisible(boolean isVisible) {
setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], isVisible ? mRightDrawable : null, getCompoundDrawables()[3]);
}
5.如果输入的为空,就播放一个动画
public void setShakeAnimation(){
this.setAnimation(shakeAnimation(5));
}
public Animation shakeAnimation(int CycleTimes) {
Animation translateAnimation = new TranslateAnimation(0, 10, 0, 10);
//设置动画插入器
translateAnimation.setInterpolator(new CycleInterpolator(CycleTimes));
translateAnimation.setDuration(1000);
return translateAnimation;
}