今天,看到一个很好的自定义输入框控件,于是记录一下。


效果很好:



一,自定义一个类,名为ClearEditText

package com.example.clearedittext;import android.content.Context;import android.graphics.drawable.Drawable;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;public class ClearEditText extends EditText implements          OnFocusChangeListener, TextWatcher { /** * 删除按钮的引用 */    private Drawable mClearDrawable;     /**     * 控件是否有焦点     */    private boolean hasFoucs;     public ClearEditText(Context context) {     this(context, null);     }      public ClearEditText(Context context, AttributeSet attrs) {     //这里构造方法也很重要,不加这个很多属性不能再XML里面定义    this(context, attrs, android.R.attr.editTextStyle);     }         public ClearEditText(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();    }            private void init() {     //获取EditText的DrawableRight,假如没有设置我们就使用默认的图片    mClearDrawable = getCompoundDrawables()[2];         if (mClearDrawable == null) { //        throw new NullPointerException("You can add drawableRight attribute in XML");        mClearDrawable = getResources().getDrawable(R.drawable.delete_selector);         }                 mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());         //默认设置隐藏图标        setClearIconVisible(false);         //设置焦点改变的监听        setOnFocusChangeListener(this);         //设置输入框里面内容发生改变的监听        addTextChangedListener(this);     }       /**     * 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件     * 当我们按下的位置 在  EditText的宽度 - 图标到控件右边的间距 - 图标的宽度  和     * EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向就没有考虑     */    @Override public boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP) {if (getCompoundDrawables()[2] != null) {boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())&& (event.getX() < ((getWidth() - getPaddingRight())));if (touchable) {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);         }     }       /**     * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去     * @param visible     */    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;    }  }

里面设置点击与输入的监听的代码,

setClearIconVisible()方法,设置隐藏和显示清除图标的方法,我们这里不是调用setVisibility()方法,setVisibility()这个方法是针对View的,我们可以调用setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)来设置上下左右的图标

  • setOnFocusChangeListener(this) 为输入框设置焦点改变监听,如果输入框有焦点,我们判断输入框的值是否为空,为空就隐藏清除图标,否则就显示
  • addTextChangedListener(this) 为输入框设置内容改变监听,其实很简单呢,当输入框里面的内容发生改变的时候,我们需要处理显示和隐藏清除小图标,里面的内容长度不为0我们就显示,否是就隐藏,但这个需要输入框有焦点我们才改变显示或者隐藏,为什么要需要焦点,比如我们一个登陆界面,我们保存了用户名和密码,在登陆界面onCreate()的时候,我们把我们保存的密码显示在用户名输入框和密码输入框里面,输入框里面内容发生改变,导致用户名输入框和密码输入框里面的清除小图标都显示了,这显然不是我们想要的效果,所以加了一个是否有焦点的判断
  • setShakeAnimation(),这个方法是输入框左右抖动的方法,之前我在某个应用看到过类似的功能,当用户名错误,输入框就在哪里抖动,感觉挺好玩的,其实主要是用到一个移动动画,然后设置动画的变化率为正弦曲线

然后直接在布局文件使用就可以了。使用的效果


android 带清除功能的输入框控件就讲完了。



就这么简单。





















更多相关文章

  1. Android自定义dialog简单实现方法
  2. android使用sharedPreferences()方法读写文件操作
  3. Android getWindow().setFlags方法 设置窗体全屏点亮背景模糊 &&
  4. Android:Activity中onCreate方法的参数及用途
  5. 最新Android 7.1.1 截屏方法
  6. Android应用程序四种数据存取方法总结
  7. traceview的使用方法
  8. android Bimtap 各种图片处理方法、图片特效
  9. Android标题栏、状态栏图标文字颜色及背景动态变化

随机推荐

  1. Android(安卓)菜单(OptionMenu)大全 建立
  2. AudioManager详解(结合源代码)
  3. Android(安卓)PendingIntent Notificatio
  4. Android(安卓)Animation 用法解析
  5. 关于Android隐式启动Activity
  6. ubutun下NDK编译环境配置
  7. Andriod视频http://pan.baidu.com/share/
  8. Mac下Android(安卓)SDK配置环境变量的配
  9. Android加载相册和拍照
  10. Android(安卓)获得软键盘状态