Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -14,13 +17,21 @@
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;
private final int mAnimationSteps;

private boolean mWasEmpty;
private int mAnimationFrame;
private int mLabelPadding;
private Animation mAnimation = Animation.NONE;

public FloatingHintEditText(Context context) {
Expand All @@ -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());
Expand All @@ -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;
}

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand All @@ -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));
}
}
5 changes: 5 additions & 0 deletions floatinghintedittext/src/main/res/values/attrs.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="floatingHintEditTextStyle" format="reference" />
<declare-styleable name="FloatLabelView">
<attr name="dividePadding" format="dimension"/>
<attr name="hintScale" format="float"/>
<attr name="animationSteps" format="integer"/>
</declare-styleable>
</resources>
6 changes: 0 additions & 6 deletions floatinghintedittext/src/main/res/values/dimens.xml

This file was deleted.