diff --git a/floatinghintedittext/src/main/java/com/thebnich/floatinghintedittext/FloatingHintEditText.java b/floatinghintedittext/src/main/java/com/thebnich/floatinghintedittext/FloatingHintEditText.java index aafc9a4..19db1ae 100644 --- a/floatinghintedittext/src/main/java/com/thebnich/floatinghintedittext/FloatingHintEditText.java +++ b/floatinghintedittext/src/main/java/com/thebnich/floatinghintedittext/FloatingHintEditText.java @@ -2,10 +2,13 @@ import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.FontMetricsInt; +import android.os.Bundle; +import android.os.Parcelable; import android.text.TextUtils; import android.util.AttributeSet; import android.util.TypedValue; @@ -14,6 +17,13 @@ public class FloatingHintEditText extends EditText { private static enum Animation { NONE, SHRINK, GROW } + public static final String ARG_SUPER_STATE = "arg_super_state"; + public static final String ARG_TEXT_CHANGED_STATE= "arg_text_changed_state"; + + private static final int DEFAULT_DIVIDE_PADDING = 5; + private static final int DEFAULT_ANIMATION_STEPS = 6; + private static final float DEFAULT_HINT_SCALE = 0.6f; + private final Paint mFloatingHintPaint = new Paint(); private final ColorStateList mHintColors; private final float mHintScale; @@ -21,6 +31,7 @@ private static enum Animation { NONE, SHRINK, GROW } private boolean mWasEmpty; private int mAnimationFrame; + private int mLabelPadding; private Animation mAnimation = Animation.NONE; public FloatingHintEditText(Context context) { @@ -34,10 +45,16 @@ public FloatingHintEditText(Context context, AttributeSet attrs) { public FloatingHintEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - TypedValue typedValue = new TypedValue(); - getResources().getValue(R.dimen.floatinghintedittext_hint_scale, typedValue, true); - mHintScale = typedValue.getFloat(); - mAnimationSteps = getResources().getInteger(R.dimen.floatinghintedittext_animation_steps); + int defaultLabelPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_DIVIDE_PADDING, getResources().getDisplayMetrics()); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FloatLabelView); + try { + mLabelPadding = a.getDimensionPixelOffset(R.styleable.FloatLabelView_dividePadding, defaultLabelPadding); + mAnimationSteps = a.getInt(R.styleable.FloatLabelView_animationSteps, DEFAULT_ANIMATION_STEPS); + mHintScale = a.getFloat(R.styleable.FloatLabelView_hintScale, DEFAULT_HINT_SCALE); + } finally { + a.recycle(); + } mHintColors = getHintTextColors(); mWasEmpty = TextUtils.isEmpty(getText()); @@ -46,7 +63,7 @@ public FloatingHintEditText(Context context, AttributeSet attrs, int defStyle) { @Override public int getCompoundPaddingTop() { final FontMetricsInt metrics = getPaint().getFontMetricsInt(); - final int floatingHintHeight = (int) ((metrics.bottom - metrics.top) * mHintScale); + final int floatingHintHeight = (int) ((metrics.bottom - metrics.top) * mHintScale) + mLabelPadding; return super.getCompoundPaddingTop() + floatingHintHeight; } @@ -97,7 +114,7 @@ protected void onDraw(Canvas canvas) { final float hintPosX = getCompoundPaddingLeft() + getScrollX(); final float normalHintPosY = getBaseline(); - final float floatingHintPosY = normalHintPosY + getPaint().getFontMetricsInt().top + getScrollY(); + final float floatingHintPosY = normalHintPosY + getPaint().getFontMetricsInt().top + getScrollY() - mLabelPadding; final float normalHintSize = getTextSize(); final float floatingHintSize = normalHintSize * mHintScale; @@ -130,7 +147,7 @@ protected void onDraw(Canvas canvas) { } private void drawAnimationFrame(Canvas canvas, float fromSize, float toSize, - float hintPosX, float fromY, float toY) { + float hintPosX, float fromY, float toY) { final float textSize = lerp(fromSize, toSize); final float hintPosY = lerp(fromY, toY); mFloatingHintPaint.setTextSize(textSize); @@ -141,4 +158,19 @@ private float lerp(float from, float to) { final float alpha = (float) mAnimationFrame / (mAnimationSteps - 1); return from * (1 - alpha) + to * alpha; } -} + + @Override + public Parcelable onSaveInstanceState() { + Bundle bundle = new Bundle(); + bundle.putParcelable(ARG_SUPER_STATE, super.onSaveInstanceState()); + bundle.putBoolean(ARG_TEXT_CHANGED_STATE, mWasEmpty); + return bundle; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + Bundle bundle = (Bundle) state; + mWasEmpty = bundle.getBoolean(ARG_SUPER_STATE); + super.onRestoreInstanceState(bundle.getParcelable(ARG_TEXT_CHANGED_STATE)); + } +} \ No newline at end of file diff --git a/floatinghintedittext/src/main/res/values/attrs.xml b/floatinghintedittext/src/main/res/values/attrs.xml index 03ea9ec..1dd24fc 100644 --- a/floatinghintedittext/src/main/res/values/attrs.xml +++ b/floatinghintedittext/src/main/res/values/attrs.xml @@ -1,4 +1,9 @@ + + + + + \ No newline at end of file diff --git a/floatinghintedittext/src/main/res/values/dimens.xml b/floatinghintedittext/src/main/res/values/dimens.xml deleted file mode 100644 index 91c7713..0000000 --- a/floatinghintedittext/src/main/res/values/dimens.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 0.6 - 6 - -