转载请标明出处:
http://blog.csdn.net/tyzlmjj/article/details/49156765
本文出自:【M家杰的博客】
概述
安卓开发中有时经常会用到编辑框(登录、找回密码等场景),但是安卓的EditText竟然不自带清空内容的功能,网上找了下资料自定义带清空功能的EditText还是比较多的,但是自带明文和密文切换的基本没有,所以自己没事干做了一个带点动画效果的自定义EditText。
实现的功能:
1. 清除按钮
2. 明文切换按钮
3. 按钮进入的动画
4. 错误抖动效果
5. material 风格
DEMO
先放上演示图
1. 单独EditText效果
2. 配合TextInputLayout使用的效果
实现方式
网上最常见的实现带清空按钮的EditText方式是:设置drawableRight为删除按钮–>监听触控事件做清空操作
这种方式很简单,但也存在局限性,比如drawableRight被占用、动画效果不可实现等。因为我自己比较喜欢带点动效的UI,所以换了一种方案实现:
重写onDraw()方法 –>利用属性动画刷新实现动效–>监听触控事件做清空操作
完整的代码
先把完整的ClearEditText 的代码放上来,方便阅读和直接复制,后面详细讲解关键代码
public class ClearEditText extends AppCompatEditText {
//按钮资源
private final int CLEAR = R.drawable.clearfill;
//动画时长
private final int ANIMATOR_TIME = 200;
//按钮左右间隔,单位DP
private final int INTERVAL = 5;
//清除按钮宽度,单位DP
private final int WIDTH_OF_CLEAR = 23;
//间隔记录
private int Interval;
//清除按钮宽度记录
private int mWidth_clear;
//右内边距
private int mPaddingRight;
//清除按钮的bitmap
private Bitmap mBitmap_clear;
//清除按钮出现动画
private ValueAnimator mAnimator_visible;
//消失动画
private ValueAnimator mAnimator_gone;
//是否显示的记录
private boolean isVisible = false;
//右边添加其他按钮时使用
private int mRight = 0;
public ClearEditText(final Context context) {
super(context);
init(context);
}
public ClearEditText(final Context context,final AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ClearEditText(final Context context,final AttributeSet attrs,final int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
//setSingleLine();这个方法不推荐写在代码中,原因请看博客尾部更新
mBitmap_clear = createBitmap(CLEAR,context);
Interval = dp2px(INTERVAL);
mWidth_clear = dp2px(WIDTH_OF_CLEAR);
mPaddingRight = Interval + mWidth_clear + Interval ;
mAnimator_gone = ValueAnimator.ofFloat(1f, 0f).setDuration(ANIMATOR_TIME);
mAnimator_visible = ValueAnimator.ofInt(mWidth_clear + Interval,0).setDuration(ANIMATOR_TIME);
}
@Override