当前位置:   article > 正文

android EditText在输入的时候输入框上方出现悬浮文字提示_安卓输入框提示文字上浮

安卓输入框提示文字上浮

近几日有些时间。所以想找些效果来研究。逛逛论坛发现 Edittext上面能悬浮文字提示。当EditText在输入的时候出输入框上方 能出现悬浮文字提示。我找了很多资料看了一些论坛。最后被我无意间找到了  有一个自定义的控件:FloatlabeledEdittext 能让嵌套在布局之内的EditText在输入的时候出输入框上方现悬浮文字提示。别急,后面会给大家源码地址的。好东西当然要分享啦!同时感谢原作者无私的分享,后面介绍下怎么用吧!

顺便把效果图贴出来先:

下面是自定义类FloatLabeledEditText 的代码:

     1. 主要就给edittext添加addTextChangedListener 监听,有输入文字的时候执行方法setShowHint(final boolean show)判断显示hint文字

  1. package com.eightzero.floatlabelededittext.view;
  2. import com.example.floatlabelededittext.R;
  3. import android.animation.Animator;
  4. import android.animation.AnimatorListenerAdapter;
  5. import android.animation.AnimatorSet;
  6. import android.animation.ObjectAnimator;
  7. import android.annotation.SuppressLint;
  8. import android.annotation.TargetApi;
  9. import android.content.Context;
  10. import android.content.res.TypedArray;
  11. import android.graphics.drawable.Drawable;
  12. import android.os.Build;
  13. import android.text.Editable;
  14. import android.text.TextUtils;
  15. import android.text.TextWatcher;
  16. import android.util.AttributeSet;
  17. import android.util.TypedValue;
  18. import android.view.Gravity;
  19. import android.view.View;
  20. import android.view.ViewGroup;
  21. import android.widget.EditText;
  22. import android.widget.FrameLayout;
  23. import android.widget.TextView;
  24. /**
  25.  * 让嵌套在floatlabelededittext布局之内的EditText在输入的时候出输入框上方现悬浮文字提示 
  26.  * 使用方法 布局文件  EditText 外层套上com.eightzero.floatlabelededittext.view.FloatLabeledEditText 即可
  27.  */
  28. public class FloatLabeledEditText extends FrameLayout {
  29.     private static final int DEFAULT_PADDING_LEFT= 2;
  30.     private TextView mHintTextView;
  31.     private EditText mEditText;
  32.     private Context mContext;
  33.         public FloatLabeledEditText(Context context) {
  34.         super(context);
  35.         mContext = context;
  36.     }
  37.     public FloatLabeledEditText(Context context, AttributeSet attrs) {
  38.         super(context, attrs);
  39.         mContext = context;
  40.         setAttributes(attrs);
  41.     }
  42.     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  43.     public FloatLabeledEditText(Context context, AttributeSet attrs, int defStyle) {
  44.         super(context, attrs, defStyle);
  45.         mContext = context;
  46.         setAttributes(attrs);
  47.     }
  48.     private void setAttributes(AttributeSet attrs) {
  49.         mHintTextView = new TextView(mContext);
  50.         final TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.FloatLabeledEditText);
  51.         final int padding = a.getDimensionPixelSize(R.styleable.FloatLabeledEditText_fletPadding, 0);
  52.         final int defaultPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_PADDING_LEFT, getResources().getDisplayMetrics());
  53.         final int paddingLeft = a.getDimensionPixelSize(R.styleable.FloatLabeledEditText_fletPaddingLeft, defaultPadding);
  54.         final int paddingTop = a.getDimensionPixelSize(R.styleable.FloatLabeledEditText_fletPaddingTop, 0);
  55.         final int paddingRight = a.getDimensionPixelSize(R.styleable.FloatLabeledEditText_fletPaddingRight, 0);
  56.         final int paddingBottom = a.getDimensionPixelSize(R.styleable.FloatLabeledEditText_fletPaddingBottom, 0);
  57.         Drawable background = a.getDrawable(R.styleable.FloatLabeledEditText_fletBackground);
  58.         if (padding != 0) {
  59.             mHintTextView.setPadding(padding, padding, padding, padding);
  60.         } else {
  61.             mHintTextView.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
  62.         }
  63.         if (background != null) {
  64.             setHintBackground(background);
  65.         }
  66.         mHintTextView.setTextAppearance(mContext, a.getResourceId(R.styleable.FloatLabeledEditText_fletTextAppearance, android.R.style.TextAppearance_Small));
  67.         //Start hidden
  68.         mHintTextView.setVisibility(INVISIBLE);
  69.         AnimatorProxy.wrap(mHintTextView).setAlpha(0);
  70.         addView(mHintTextView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  71.         a.recycle();
  72.     }
  73.     @SuppressLint("NewApi")
  74.     private void setHintBackground(Drawable background) {
  75.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
  76.             mHintTextView.setBackground(background);
  77.         } else {
  78.             mHintTextView.setBackgroundDrawable(background);
  79.         }
  80.     }
  81.     @Override
  82.     public final void addView(View child, int index, ViewGroup.LayoutParams params) {
  83.         if (child instanceof EditText) {
  84.             if (mEditText != null) {
  85.                 throw new IllegalArgumentException("Can only have one Edittext subview");
  86.             }
  87.             final LayoutParams lp = new LayoutParams(params);
  88.             lp.gravity = Gravity.BOTTOM;
  89.             lp.topMargin = (int) (mHintTextView.getTextSize() + mHintTextView.getPaddingBottom() + mHintTextView.getPaddingTop());
  90.             params = lp;
  91.             setEditText((EditText) child);
  92.         }
  93.         super.addView(child, index, params);
  94.     }
  95.     private void setEditText(EditText editText) {
  96.         mEditText = editText;
  97.         mEditText.addTextChangedListener(new TextWatcher() {
  98.             @Override
  99.             public void afterTextChanged(Editable s) {
  100.                 setShowHint(!TextUtils.isEmpty(s));
  101.             }
  102.             @Override
  103.             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  104.             }
  105.             @Override
  106.             public void onTextChanged(CharSequence s, int start, int before, int count) {
  107.             }
  108.         });
  109.         mEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
  110.             @Override
  111.             public void onFocusChange(View view, boolean gotFocus) {
  112.                 onFocusChanged(gotFocus);
  113.             }
  114.         });
  115.         mHintTextView.setText(mEditText.getHint());
  116.         if(!TextUtils.isEmpty(mEditText.getText())){
  117.             mHintTextView.setVisibility(VISIBLE);
  118.         }
  119.     }
  120.     private void onFocusChanged(boolean gotFocus) {
  121.         if (gotFocus && mHintTextView.getVisibility() == VISIBLE) {
  122.             ObjectAnimator.ofFloat(mHintTextView, "alpha", 0.33f, 1f).start();
  123.         } else if (mHintTextView.getVisibility() == VISIBLE) {
  124.             AnimatorProxy.wrap(mHintTextView).setAlpha(1f);  //Need this for compat reasons
  125.             ObjectAnimator.ofFloat(mHintTextView, "alpha", 1f, 0.33f).start();
  126.         }
  127.     }
  128.     private void setShowHint(final boolean show) {
  129.         AnimatorSet animation = null;
  130.         if ((mHintTextView.getVisibility() == VISIBLE) && !show) {
  131.             animation = new AnimatorSet();
  132.             ObjectAnimator move = ObjectAnimator.ofFloat(mHintTextView, "translationY", 0, mHintTextView.getHeight() / 8);
  133.             ObjectAnimator fade = ObjectAnimator.ofFloat(mHintTextView, "alpha", 1, 0);
  134.             animation.playTogether(move, fade);
  135.         } else if ((mHintTextView.getVisibility() != VISIBLE) && show) {
  136.             animation = new AnimatorSet();
  137.             ObjectAnimator move = ObjectAnimator.ofFloat(mHintTextView, "translationY", mHintTextView.getHeight() / 8, 0);
  138.             ObjectAnimator fade;
  139.             if (mEditText.isFocused()) {
  140.                 fade = ObjectAnimator.ofFloat(mHintTextView, "alpha", 0, 1);
  141.             } else {
  142.                 fade = ObjectAnimator.ofFloat(mHintTextView, "alpha", 0, 0.33f);
  143.             }
  144.             animation.playTogether(move, fade);
  145.         }
  146.         if (animation != null) {
  147.             animation.addListener(new AnimatorListenerAdapter() {
  148.                 @Override
  149.                 public void onAnimationStart(Animator animation) {
  150.                     super.onAnimationStart(animation);
  151.                     mHintTextView.setVisibility(VISIBLE);
  152.                 }
  153.                 @Override
  154.                 public void onAnimationEnd(Animator animation) {
  155.                     super.onAnimationEnd(animation);
  156.                     mHintTextView.setVisibility(show ? VISIBLE : INVISIBLE);
  157.                     AnimatorProxy.wrap(mHintTextView).setAlpha(show ? 1 : 0);
  158.                 }
  159.             });
  160.             animation.start();
  161.         }
  162.     }
  163.     public EditText getEditText() {
  164.         return mEditText;
  165.     }
  166.     public void setHint(String hint) {
  167.         mEditText.setHint(hint);
  168.         mHintTextView.setText(hint);
  169.     }
  170.     public CharSequence getHint() {
  171.         return mHintTextView.getHint();
  172.     }
  173. }

使用的方法:

      1.在EditText控件的外面放一层自定义控件 FloatLabeledEditText 就可以了

  1.  <com.eightzero.floatlabelededittext.view.FloatLabeledEditText
  2.         android:layout_width="match_parent"
  3.         android:layout_height="wrap_content">
  4.         <EditText
  5.             android:layout_width="match_parent"
  6.             android:layout_height="wrap_content"
  7.             android:hint="This is the hint" />
  8.     </com.eightzero.floatlabelededittext.view.FloatLabeledEditText>
  9. <!-- add some padding -->
  10.     <com.eightzero.floatlabelededittext.view.FloatLabeledEditText
  11.         android:layout_width="match_parent"
  12.         android:layout_height="wrap_content"
  13.         float:fletPadding="10dp">
  14.         <EditText
  15.             android:layout_width="match_parent"
  16.             android:layout_height="wrap_content"
  17.             android:hint="Username" />
  18.     </com.eightzero.floatlabelededittext.view.FloatLabeledEditText>
  19. <!-- password input -->
  20.     <com.eightzero.floatlabelededittext.view.FloatLabeledEditText
  21.         android:layout_width="match_parent"
  22.         android:layout_height="wrap_content"
  23.         float:fletPaddingBottom="10dp">
  24.         <EditText
  25.             android:layout_width="match_parent"
  26.             android:layout_height="wrap_content"
  27.             android:hint="Password"
  28.             android:inputType="textPassword" />
  29.     </com.eightzero.floatlabelededittext.view.FloatLabeledEditText>
  30.     <!-- change color of hint text-->
  31.     <com.eightzero.floatlabelededittext.view.FloatLabeledEditText
  32.         android:layout_width="match_parent"
  33.         android:layout_height="wrap_content"
  34.         float:fletPaddingBottom="10dp"
  35.         float:fletTextAppearance="@style/floatlabelededittext">
  36.         <EditText
  37.             android:layout_width="match_parent"
  38.             android:layout_height="wrap_content"
  39.             android:hint="Styled Hint"
  40.             android:inputType="textPassword" />
  41.     </com.eightzero.floatlabelededittext.view.FloatLabeledEditText>

我还找到了一个类似的控件是5.0之后出的一个控件 是系统自带的。顺便也分享下吧!原作者的资源也分享出来,可自行下载,在下面。

效果如下:

使用方法就介绍到这。希望能帮到你,我把源码分享出来,有什么问题可以留言,转载请注明出处哦!

源码下载

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/66235
推荐阅读
相关标签
  

闽ICP备14008679号