Android登陆界面实现清除输入框内容和震动效果

 更新时间:2015年12月13日 15:23:04   作者:徐刘根  
这篇文章主要介绍了Android登陆界面实现清除输入框内容和震动效果,感兴趣的小伙伴们可以参考一下

本文为大家分享Android登陆界面实现清除输入框内容和震动效果的全部代码,具体内容如下:

效果图:

主要代码如下

自定义的一个EditText,用于实现有文字的时候显示可以清楚的按钮:

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.animation.Animation;
import android.view.animation.CycleInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.EditText;

public class ClearEditText extends EditText implements View.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.selector_ic_delete);
      }

      //getIntrinsicWidth()取得的是Drawable在手机上的宽度,所以不同分辨率下获取到的值是不同的,关键所在处
      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;
    }
}

MainActivity.java 主要是弹出一句话表示按钮的点击事件

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity;

public class MainActivity extends Activity {

  private Button btnLogin;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    btnLogin = (Button) this.findViewById(R.id.btnLogin);
  }

  public void login(View view) {
    Toast.makeText(this, "登陆", Toast.LENGTH_LONG).show();

  }
}

布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="#ffffffff"
  android:orientation="vertical"
  android:padding="4.0dip" >

  <com.xuliugen.clearedittext.ClearEditText
    android:id="@+id/etxtEmail"
    style="@style/editText"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="30.0dip"
    android:drawableLeft="@drawable/icon_reg_name"
    android:drawablePadding="10.0dip"
    android:hint="使用邮箱登陆" />

  <com.xuliugen.clearedittext.ClearEditText
    android:id="@+id/etxtPwd"
    style="@style/editText"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20.0dip"
    android:drawableLeft="@drawable/icon_reg_password"
    android:drawablePadding="10.0dip"
    android:hint="输入登陆密码"
    android:inputType="textPassword" />

  <Button
    android:id="@+id/btnLogin"
    style="@style/bigGreenButton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20.0dip"
    android:onClick="login"
    android:text="登陆" />

</LinearLayout>

另外还有一些selector文件,图片资源等:
bg_btn_style_green.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:state_enabled="false"><shape android:shape="rectangle">
      <corners android:radius="2.0dip" />

      <solid android:color="@color/green_btn_color_disable" />
    </shape></item>
  <item android:state_pressed="true"><shape android:shape="rectangle">
      <corners android:radius="2.0dip" />

      <solid android:color="@color/green_btn_color_pressed" />
    </shape></item>
  <item><shape android:shape="rectangle">
      <corners android:radius="2.0dip" />

      <solid android:color="@color/green_btn_color_normal" />
    </shape></item>

</selector>

bg_edittext_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:drawable="@drawable/input_bar_bg_active" android:state_focused="true"/>
  <item android:drawable="@drawable/input_bar_bg_normal"/>

</selector>

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

相关文章

  • 利用kotlin实现一个打方块的小游戏实例教程

    利用kotlin实现一个打方块的小游戏实例教程

    最近在学习kotlin,利用其实现了一个小游戏,觉着有必要和大家分享下,所以下面这篇文章主要给大家介绍了关于利用kotlin实现一个打方块的小游戏的相关资料,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Android利用Flutter实现立体旋转效果

    Android利用Flutter实现立体旋转效果

    本文主要介绍了Flutter绘图如何使用ImageShader填充图形,并且利用 Matrix4的三维变换加上动画实现了立体旋转的动画效果,感兴趣的可以尝试一下
    2022-06-06
  • Android实现Bitmap位图旋转效果

    Android实现Bitmap位图旋转效果

    这篇文章主要为大家详细介绍了Android实现Bitmap位图旋转效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Android中程序的停止状态详细介绍

    Android中程序的停止状态详细介绍

    这篇文章主要介绍了Android中程序的停止状态详细介绍,本文讲解了什么是程序的停止状态、为什么Android要引入这一状态、激活状态和停止状态的切换、如何变为停止状态等内容,需要的朋友可以参考下
    2015-01-01
  • android viewflipper实现左右滑动切换显示图片

    android viewflipper实现左右滑动切换显示图片

    这篇文章主要为大家详细介绍了android viewflipper实现左右滑动切换显示图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Android实现自定义圆形进度条

    Android实现自定义圆形进度条

    这篇文章主要介绍了Android自定义圆形进度条实现代码,进度条在Android中教程经常使用到,本文向大家分享了Android实现自定义圆形进度条的代码,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Android控件之SeekBar的用法总结

    Android控件之SeekBar的用法总结

    SeekBar是进度条。本篇文章介绍了Android控件之SeekBar的使用,SeekBar的应用非常广,比如用来显示音量条、播放进度条,有水平显示也有垂直显示,有兴趣的可以了解一下。
    2017-01-01
  • Android自定义View 仿QQ侧滑菜单的实现代码

    Android自定义View 仿QQ侧滑菜单的实现代码

    这篇文章主要介绍了Android自定义View 仿QQ侧滑菜单的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-08-08
  • Android ListView 实例讲解清晰易懂

    Android ListView 实例讲解清晰易懂

    这篇文章主要通过实例介绍了Android ListView,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 详解Android中Room组件的使用

    详解Android中Room组件的使用

    Room 是在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库,这篇文章主要为大家介绍了Room组件的具体使用,需要的可以参考下
    2023-08-08

最新评论