Android EditText带清空按钮&动画

本文介绍了如何在Android开发中创建一个带有清空内容功能且支持动画效果的EditText。作者通过重写onDraw()方法,利用属性动画实现清空按钮的显示与隐藏,并在触摸事件中监听清除操作。此外,还提到了如何处理内容改变的监听以及错误提示功能。文章提供了完整的代码示例和资源下载链接。
摘要由CSDN通过智能技术生成

转载请标明出处:
http://blog.csdn.net/tyzlmjj/article/details/49156765
本文出自:【M家杰的博客】

概述
安卓开发中有时经常会用到编辑框(登录、找回密码等场景),但是安卓的EditText竟然不自带清空内容的功能,网上找了下资料自定义带清空功能的EditText还是比较多的,但是自带明文和密文切换的基本没有,所以自己没事干做了一个带点动画效果的自定义EditText。

实现的功能:

    1. 清除按钮
    2. 明文切换按钮
    3. 按钮进入的动画
    4. 错误抖动效果
    5. material 风格

DEMO

先放上演示图
1. 单独EditText效果
单独EditText效果
2. 配合TextInputLayout使用的效果
配合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
    
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值