自定带清除和动画提示的EditText

来源:互联网 发布:淘宝网吸顶灯 编辑:程序博客网 时间:2024/06/08 17:14


转自: http://blog.csdn.net/xiaanming/article/details/11066685

MyEditText:

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;      }        }  

xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:background="#95CAE4">          <com.example.clearedittext.ClearEditText          android:id="@+id/username"          android:layout_marginTop="60dp"          android:layout_width="fill_parent"          android:background="@drawable/login_edittext_bg"           android:drawableLeft="@drawable/icon_user"          android:layout_marginLeft="10dip"          android:layout_marginRight="10dip"          android:singleLine="true"          android:drawableRight="@drawable/delete_selector"          android:hint="输入用户名"          android:layout_height="wrap_content" >        </com.example.clearedittext.ClearEditText>        <com.example.clearedittext.ClearEditText          android:id="@+id/password"          android:layout_marginLeft="10dip"          android:layout_marginRight="10dip"          android:layout_marginTop="10dip"          android:drawableLeft="@drawable/account_icon"          android:hint="输入密码"          android:singleLine="true"          android:password="true"          android:drawableRight="@drawable/delete_selector"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:layout_below="@id/username"          android:background="@drawable/login_edittext_bg" >      </com.example.clearedittext.ClearEditText>        <Button          android:id="@+id/login"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:layout_marginLeft="10dip"          android:layout_marginRight="10dip"          android:background="@drawable/login_button_bg"          android:textSize="18sp"          android:textColor="@android:color/white"          android:layout_below="@+id/password"          android:layout_marginTop="25dp"          android:text="登录" />    </RelativeLayout>  

Activity

import android.app.Activity;  import android.os.Bundle;  import android.text.TextUtils;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;  import android.widget.Toast;    public class MainActivity extends Activity {      private Toast mToast;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);                    final ClearEditText username = (ClearEditText) findViewById(R.id.username);          final ClearEditText password = (ClearEditText) findViewById(R.id.password);                    ((Button) findViewById(R.id.login)).setOnClickListener(new OnClickListener() {                            @Override              public void onClick(View v) {                  if(TextUtils.isEmpty(username.getText())){                      //设置晃动                      username.setShakeAnimation();                      //设置提示                      showToast("用户名不能为空");                      return;                  }                                    if(TextUtils.isEmpty(password.getText())){                      password.setShakeAnimation();                      showToast("密码不能为空");                      return;                  }              }          });      }            /**      * 显示Toast消息      * @param msg      */      private void showToast(String msg){          if(mToast == null){              mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);          }else{              mToast.setText(msg);          }          mToast.show();      }      }  




0 0