mirror of https://github.com/kurisufriend/Clover
parent
93e8a9aaf5
commit
3e2c34c3bd
@ -1,233 +0,0 @@ |
|||||||
package com.micromobs.android.floatlabel; |
|
||||||
|
|
||||||
import org.floens.chan.R; |
|
||||||
|
|
||||||
import android.animation.ArgbEvaluator; |
|
||||||
import android.animation.ValueAnimator; |
|
||||||
import android.annotation.TargetApi; |
|
||||||
import android.content.Context; |
|
||||||
import android.content.res.TypedArray; |
|
||||||
import android.text.Editable; |
|
||||||
import android.text.TextWatcher; |
|
||||||
import android.util.AttributeSet; |
|
||||||
import android.util.TypedValue; |
|
||||||
import android.view.LayoutInflater; |
|
||||||
import android.view.View; |
|
||||||
import android.view.WindowManager; |
|
||||||
import android.view.animation.AnimationUtils; |
|
||||||
import android.widget.EditText; |
|
||||||
import android.widget.LinearLayout; |
|
||||||
import android.widget.TextView; |
|
||||||
|
|
||||||
@TargetApi(11) |
|
||||||
public class FloatLabelEditText extends LinearLayout { |
|
||||||
|
|
||||||
private int mFocusedColor, mUnFocusedColor, mFitScreenWidth; |
|
||||||
private final int mCurrentApiVersion = android.os.Build.VERSION.SDK_INT; |
|
||||||
private float mTextSizeInSp; |
|
||||||
private String mHintText, mEditText; |
|
||||||
|
|
||||||
private AttributeSet mAttrs; |
|
||||||
private final Context mContext; |
|
||||||
private EditText mEditTextView; |
|
||||||
private TextView mFloatingLabel; |
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// default constructors
|
|
||||||
|
|
||||||
public FloatLabelEditText(Context context) { |
|
||||||
super(context); |
|
||||||
mContext = context; |
|
||||||
initializeView(); |
|
||||||
} |
|
||||||
|
|
||||||
public FloatLabelEditText(Context context, AttributeSet attrs) { |
|
||||||
super(context, attrs); |
|
||||||
mContext = context; |
|
||||||
mAttrs = attrs; |
|
||||||
initializeView(); |
|
||||||
} |
|
||||||
|
|
||||||
public FloatLabelEditText(Context context, AttributeSet attrs, int defStyle) { |
|
||||||
super(context, attrs, defStyle); |
|
||||||
mContext = context; |
|
||||||
mAttrs = attrs; |
|
||||||
initializeView(); |
|
||||||
} |
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// public interface
|
|
||||||
|
|
||||||
public EditText getEditText() { |
|
||||||
return mEditTextView; |
|
||||||
} |
|
||||||
|
|
||||||
public String getText() { |
|
||||||
if (getEditTextString() != null && |
|
||||||
getEditTextString().toString() != null && |
|
||||||
getEditTextString().toString().length() > 0) { |
|
||||||
return getEditTextString().toString(); |
|
||||||
} |
|
||||||
return ""; |
|
||||||
} |
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// private helpers
|
|
||||||
|
|
||||||
private void initializeView() { |
|
||||||
|
|
||||||
if (mContext == null) return; |
|
||||||
|
|
||||||
LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
|
||||||
mInflater.inflate(R.layout.floatlabel_edittext, this, true); |
|
||||||
|
|
||||||
mFloatingLabel = (TextView) findViewById(R.id.floating_label_hint); |
|
||||||
mEditTextView = (EditText) findViewById(R.id.floating_label_edit_text); |
|
||||||
|
|
||||||
getAttributesFromXmlAndStoreLocally(); |
|
||||||
setupEditTextView(); |
|
||||||
setupFloatingLabel(); |
|
||||||
} |
|
||||||
|
|
||||||
private void getAttributesFromXmlAndStoreLocally() { |
|
||||||
TypedArray attributesFromXmlLayout = mContext.obtainStyledAttributes(mAttrs, R.styleable.FloatLabelEditText ); |
|
||||||
if (attributesFromXmlLayout == null) return; |
|
||||||
|
|
||||||
mHintText = attributesFromXmlLayout.getString(R.styleable.FloatLabelEditText_hint); |
|
||||||
mEditText = attributesFromXmlLayout.getString(R.styleable.FloatLabelEditText_text); |
|
||||||
mTextSizeInSp = getScaledFontSize(attributesFromXmlLayout.getDimensionPixelSize(R.styleable.FloatLabelEditText_textSize, (int) mEditTextView.getTextSize())); |
|
||||||
mFocusedColor = attributesFromXmlLayout.getColor(R.styleable.FloatLabelEditText_textColorHintFocused, android.R.color.black); |
|
||||||
mUnFocusedColor = attributesFromXmlLayout.getColor(R.styleable.FloatLabelEditText_textColorHintUnFocused, android.R.color.darker_gray); |
|
||||||
mFitScreenWidth = attributesFromXmlLayout.getInt(R.styleable.FloatLabelEditText_fitScreenWidth, 0); |
|
||||||
|
|
||||||
attributesFromXmlLayout.recycle(); |
|
||||||
} |
|
||||||
|
|
||||||
private void setupEditTextView() { |
|
||||||
mEditTextView.setHint(mHintText); |
|
||||||
mEditTextView.setHintTextColor(mUnFocusedColor); |
|
||||||
mEditTextView.setText(mEditText); |
|
||||||
mEditTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mTextSizeInSp); |
|
||||||
mEditTextView.addTextChangedListener(getTextWatcher()); |
|
||||||
|
|
||||||
if (mFitScreenWidth > 0) { |
|
||||||
mEditTextView.setWidth(getSpecialWidth()); |
|
||||||
} |
|
||||||
|
|
||||||
if (mCurrentApiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { |
|
||||||
mEditTextView.setOnFocusChangeListener(getFocusChangeListener()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private void setupFloatingLabel() { |
|
||||||
mFloatingLabel.setText(mHintText); |
|
||||||
mFloatingLabel.setTextColor(mUnFocusedColor); |
|
||||||
mFloatingLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, (float) (mTextSizeInSp / 1.3)); |
|
||||||
|
|
||||||
mFloatingLabel.setPadding(mEditTextView.getPaddingLeft(), 0, 0, 0); |
|
||||||
|
|
||||||
if (getText().length() > 0) { |
|
||||||
showFloatingLabel(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private TextWatcher getTextWatcher() { |
|
||||||
return new TextWatcher() { |
|
||||||
@Override |
|
||||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void onTextChanged(CharSequence s, int start, int before, int count) {} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void afterTextChanged(Editable s) { |
|
||||||
if (s.length() > 0 && mFloatingLabel.getVisibility() == INVISIBLE) { |
|
||||||
showFloatingLabel(); |
|
||||||
} else if (s.length() == 0 && mFloatingLabel.getVisibility() == VISIBLE) { |
|
||||||
hideFloatingLabel(); |
|
||||||
} |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
private void showFloatingLabel() { |
|
||||||
mFloatingLabel.setVisibility(VISIBLE); |
|
||||||
mFloatingLabel.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.slide_from_bottom)); |
|
||||||
} |
|
||||||
|
|
||||||
private void hideFloatingLabel() { |
|
||||||
mFloatingLabel.setVisibility(INVISIBLE); |
|
||||||
mFloatingLabel.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.slide_to_bottom)); |
|
||||||
} |
|
||||||
|
|
||||||
private OnFocusChangeListener getFocusChangeListener() { |
|
||||||
return new OnFocusChangeListener() { |
|
||||||
|
|
||||||
ValueAnimator mFocusToUnfocusAnimation, mUnfocusToFocusAnimation; |
|
||||||
|
|
||||||
@Override |
|
||||||
public void onFocusChange(View v, boolean hasFocus) { |
|
||||||
ValueAnimator lColorAnimation; |
|
||||||
|
|
||||||
if (hasFocus) { |
|
||||||
lColorAnimation = getFocusToUnfocusAnimation(); |
|
||||||
} else { |
|
||||||
lColorAnimation = getUnfocusToFocusAnimation(); |
|
||||||
} |
|
||||||
|
|
||||||
lColorAnimation.setDuration(700); |
|
||||||
lColorAnimation.start(); |
|
||||||
} |
|
||||||
|
|
||||||
private ValueAnimator getFocusToUnfocusAnimation() { |
|
||||||
if (mFocusToUnfocusAnimation == null) { |
|
||||||
mFocusToUnfocusAnimation = getFocusAnimation(mUnFocusedColor, mFocusedColor); |
|
||||||
} |
|
||||||
return mFocusToUnfocusAnimation; |
|
||||||
} |
|
||||||
|
|
||||||
private ValueAnimator getUnfocusToFocusAnimation() { |
|
||||||
if (mUnfocusToFocusAnimation == null) { |
|
||||||
mUnfocusToFocusAnimation = getFocusAnimation(mFocusedColor, mUnFocusedColor); |
|
||||||
} |
|
||||||
return mUnfocusToFocusAnimation; |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
private ValueAnimator getFocusAnimation(int fromColor, int toColor) { |
|
||||||
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), fromColor, toColor); |
|
||||||
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { |
|
||||||
@Override |
|
||||||
public void onAnimationUpdate(ValueAnimator animator) { |
|
||||||
mFloatingLabel.setTextColor((Integer) animator.getAnimatedValue()); |
|
||||||
} |
|
||||||
}); |
|
||||||
return colorAnimation; |
|
||||||
} |
|
||||||
|
|
||||||
private Editable getEditTextString() { |
|
||||||
return mEditTextView.getText(); |
|
||||||
} |
|
||||||
|
|
||||||
private float getScaledFontSize(float fontSizeFromAttributes) { |
|
||||||
float scaledDensity = getContext().getResources().getDisplayMetrics().scaledDensity; |
|
||||||
return fontSizeFromAttributes/scaledDensity; |
|
||||||
} |
|
||||||
|
|
||||||
@SuppressWarnings({ "deprecation", "unused" }) |
|
||||||
private int getSpecialWidth() { |
|
||||||
float screenWidth = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(); |
|
||||||
int prevWidth = mEditTextView.getWidth(); |
|
||||||
|
|
||||||
switch (mFitScreenWidth) { |
|
||||||
case 2: |
|
||||||
return (int) Math.round(screenWidth * 0.5); |
|
||||||
default: |
|
||||||
return Math.round(screenWidth); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} |
|
@ -1,12 +0,0 @@ |
|||||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||||
|
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android"> |
|
||||||
<translate |
|
||||||
android:fromYDelta="5%p" |
|
||||||
android:toYDelta="0" |
|
||||||
android:duration="350" /> |
|
||||||
<alpha |
|
||||||
android:fromAlpha="0.0" |
|
||||||
android:toAlpha="1.0" |
|
||||||
android:duration="350" /> |
|
||||||
</set> |
|
@ -1,12 +0,0 @@ |
|||||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||||
|
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android"> |
|
||||||
<translate |
|
||||||
android:fromYDelta="0" |
|
||||||
android:toYDelta="5%p" |
|
||||||
android:duration="350" /> |
|
||||||
<alpha |
|
||||||
android:fromAlpha="1.0" |
|
||||||
android:toAlpha="0.0" |
|
||||||
android:duration="350" /> |
|
||||||
</set> |
|
@ -1,20 +0,0 @@ |
|||||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|
||||||
android:layout_width="wrap_content" |
|
||||||
android:layout_height="wrap_content" |
|
||||||
android:layout_marginTop="5dp" |
|
||||||
android:orientation="vertical" > |
|
||||||
|
|
||||||
<TextView |
|
||||||
android:id="@+id/floating_label_hint" |
|
||||||
android:layout_width="wrap_content" |
|
||||||
android:layout_height="wrap_content" |
|
||||||
android:layout_marginBottom="-8dp" |
|
||||||
android:visibility="invisible" /> |
|
||||||
|
|
||||||
<EditText |
|
||||||
android:id="@+id/floating_label_edit_text" |
|
||||||
android:layout_width="wrap_content" |
|
||||||
android:layout_height="wrap_content" /> |
|
||||||
|
|
||||||
</LinearLayout> |
|
Loading…
Reference in new issue