如何打造一个很不平凡的登陆输入框呢,那就自定义加上一下动画来完成:
![](https://img.haomeiwen.com/i8317701/b969ba86531c9007.png)
1.先来看看自定义的ClearEditText类
public classClearEditTextextendsEditTextimplementsView.OnFocusChangeListener,TextWatcher {
/**
* 删除按钮的引用
*/
privateDrawablemClearDrawable;
privateContextcontext;
/**
* 控件是否有焦点
*/
private booleanhasFocus;
publicClearEditText(Context context) {
this(context,null);
// super(context);
// this.context = context;
// init();
}
publicClearEditText(Context context,AttributeSet attrs){
//这里构造方法也很重要,不加这个很多属性不能再XML里面定义
this(context, attrs, android.R.attr.editTextStyle);
}
publicClearEditText(Context context, AttributeSet attrs,intdefStyle) {
super(context, attrs, defStyle);
init();
}
private voidinit() {
//获取EditText的DrawableRight,假如没有设置我们就使用默认的图片
mClearDrawable= getCompoundDrawables()[2];
if(mClearDrawable==null) {
mClearDrawable= getResources().getDrawable(R.drawable.delete_selector);
}
mClearDrawable.setBounds(0,0,mClearDrawable.getIntrinsicWidth(),mClearDrawable.getIntrinsicHeight());
//默认设置隐藏图标
setClearIconVisible(false);
//设置焦点改变的监听
setOnFocusChangeListener(this);
//设置输入框里面内容发生改变的监听
addTextChangedListener(this);
}
@Override
public booleanonTouchEvent(MotionEvent event) {
if(mClearDrawable!=null&& event.getAction() == MotionEvent.ACTION_UP) {
intx = (int) event.getX();
//判断触摸点是否在水平范围内
booleanisInnerWidth = (x > (getWidth() - getTotalPaddingRight())) &&
(x < (getWidth() - getPaddingRight()));
//获取删除图标的边界,返回一个Rect对象
Rect rect =mClearDrawable.getBounds();
//获取删除图标的高度
intheight = rect.height();
inty = (int) event.getY();
//计算图标底部到控件底部的距离
intdistance = (getHeight() - height) /2;
//判断触摸点是否在竖直范围内(可能会有点误差)
//触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标
booleanisInnerHeight = (y > distance) && (y < (distance + height));
if(isInnerHeight && isInnerWidth) {
this.setText("");
}
}
return super.onTouchEvent(event);
}
/**
* 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
*
*@paramvisible
*/
private voidsetClearIconVisible(booleanvisible) {
Drawable right = visible ?mClearDrawable:null;
setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1],
right, getCompoundDrawables()[3]);
}
/**
* 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏
*/
@Override
public voidonFocusChange(View v,booleanhasFocus) {
this.hasFocus= hasFocus;
if(hasFocus) {
setClearIconVisible(getText().length() >0);
}else{
setClearIconVisible(false);
}
}
/**
* 当输入框里面内容发生变化的时候回调的方法
*/
@Override
public voidonTextChanged(CharSequence text,intstart,intlengthBefore,intlengthAfter) {
if(hasFocus) {
setClearIconVisible(text.length() >0);
}
}
@Override
public voidbeforeTextChanged(CharSequence s,intstart,intcount,intafter) {
}
@Override
public voidafterTextChanged(Editable s) {
}
/**
* 设置晃动动画
*/
public voidsetShakeAnimation() {
this.setAnimation(shakeAnimation(5));
}
/**
* 晃动动画
*
*@paramcounts1秒钟晃动多少下
*@return
*/
public staticAnimation shakeAnimation(intcounts) {
Animation translateAnimation =newTranslateAnimation(0,10,0,0);
translateAnimation.setInterpolator(newCycleInterpolator(counts));
translateAnimation.setDuration(1000);
returntranslateAnimation;
}
}
2.接着来看看主函数的代码:
public classMainActivityextendsActivity {
privateToastmToast;
privateButtonmButton;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
finalClearEditText username = (ClearEditText) findViewById(R.id.username);
finalClearEditText password = (ClearEditText) findViewById(R.id.password);
mButton= (Button) findViewById(R.id.login);
mButton.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View v) {
if(TextUtils.isEmpty(username.getText())){
//设置晃动
username.setShakeAnimation();
//设置提示
showToast("用户名不能为空!");
return;
}
if(TextUtils.isEmpty(password.getText())){
password.setShakeAnimation();
showToast("密码不能为空!");
return;
}
}
});
}
/**
* 显示Toast消息
*@parammsg
*/
private voidshowToast(String msg) {
if(mToast==null){
mToast= Toast.makeText(this,msg,Toast.LENGTH_SHORT);
}else{
mToast.setText(msg);
}
mToast.show();
}
}
3.主函数的布局:
xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"
android:layout_height="match_parent"android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="#95CAE4"
tools:context=".MainActivity">
android:id="@+id/username"
android:layout_marginTop="60dp"
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_width="match_parent"
android:layout_height="wrap_content"/>
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_below="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/login_edittext_bg"
/>
android:id="@+id/login"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
android:background="@drawable/login_button_bg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="@android:color/white"
android:layout_below="@+id/password"
android:layout_marginTop="25dp"
android:text="登录"
/>
想要完整Demo的可以联系我,QQ1223235200
网友评论