Remote float label

captchafix
Floens 11 years ago
parent 93e8a9aaf5
commit 3e2c34c3bd
  1. 233
      Clover/app/src/main/java/com/micromobs/android/floatlabel/FloatLabelEditText.java
  2. 31
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java
  3. 12
      Clover/app/src/main/res/anim/slide_from_bottom.xml
  4. 12
      Clover/app/src/main/res/anim/slide_to_bottom.xml
  5. 20
      Clover/app/src/main/res/layout/floatlabel_edittext.xml
  6. 27
      Clover/app/src/main/res/layout/reply_input.xml
  7. 12
      Clover/app/src/main/res/values/attrs.xml

@ -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);
}
}
}

@ -49,7 +49,6 @@ import com.android.volley.Response;
import com.android.volley.VolleyError; import com.android.volley.VolleyError;
import com.android.volley.toolbox.NetworkImageView; import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.StringRequest;
import com.micromobs.android.floatlabel.FloatLabelEditText;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
@ -88,9 +87,9 @@ public class ReplyFragment extends DialogFragment {
private Button fileButton; private Button fileButton;
private Button fileDeleteButton; private Button fileDeleteButton;
private Button submitButton; private Button submitButton;
private FloatLabelEditText nameView; private EditText nameView;
private FloatLabelEditText emailView; private EditText emailView;
private FloatLabelEditText subjectView; private EditText subjectView;
private EditText commentView; private EditText commentView;
private EditText fileNameView; private EditText fileNameView;
private LoadView imageViewContainer; private LoadView imageViewContainer;
@ -164,9 +163,9 @@ public class ReplyFragment extends DialogFragment {
draft.email = ChanPreferences.getDefaultEmail(); draft.email = ChanPreferences.getDefaultEmail();
} }
nameView.getEditText().setText(draft.name); nameView.setText(draft.name);
emailView.getEditText().setText(draft.email); emailView.setText(draft.email);
subjectView.getEditText().setText(draft.subject); subjectView.setText(draft.subject);
commentView.setText(draft.comment); commentView.setText(draft.comment);
// To the end of the comment // To the end of the comment
Selection.setSelection(commentView.getText(), commentView.getText().length()); Selection.setSelection(commentView.getText(), commentView.getText().length());
@ -196,9 +195,9 @@ public class ReplyFragment extends DialogFragment {
ReplyManager replyManager = ChanApplication.getReplyManager(); ReplyManager replyManager = ChanApplication.getReplyManager();
if (shouldSaveDraft) { if (shouldSaveDraft) {
draft.name = nameView.getText(); draft.name = nameView.getText().toString();
draft.email = emailView.getText(); draft.email = emailView.getText().toString();
draft.subject = subjectView.getText(); draft.subject = subjectView.getText().toString();
draft.comment = commentView.getText().toString(); draft.comment = commentView.getText().toString();
if (fileNameView != null) { if (fileNameView != null) {
@ -228,9 +227,9 @@ public class ReplyFragment extends DialogFragment {
container = inflater.inflate(R.layout.reply_view, null); container = inflater.inflate(R.layout.reply_view, null);
flipper = (ViewFlipper) container.findViewById(R.id.reply_flipper); flipper = (ViewFlipper) container.findViewById(R.id.reply_flipper);
nameView = (FloatLabelEditText) container.findViewById(R.id.reply_name); nameView = (EditText) container.findViewById(R.id.reply_name);
emailView = (FloatLabelEditText) container.findViewById(R.id.reply_email); emailView = (EditText) container.findViewById(R.id.reply_email);
subjectView = (FloatLabelEditText) container.findViewById(R.id.reply_subject); subjectView = (EditText) container.findViewById(R.id.reply_subject);
commentView = (EditText) container.findViewById(R.id.reply_comment); commentView = (EditText) container.findViewById(R.id.reply_comment);
commentView.requestFocus(); commentView.requestFocus();
@ -469,9 +468,9 @@ public class ReplyFragment extends DialogFragment {
responseContainer.setView(null); responseContainer.setView(null);
draft.name = nameView.getText(); draft.name = nameView.getText().toString();
draft.email = emailView.getText(); draft.email = emailView.getText().toString();
draft.subject = subjectView.getText(); draft.subject = subjectView.getText().toString();
draft.comment = commentView.getText().toString(); draft.comment = commentView.getText().toString();
draft.captchaChallenge = captchaChallenge; draft.captchaChallenge = captchaChallenge;
draft.captchaResponse = captchaInput.getText().toString(); draft.captchaResponse = captchaInput.getText().toString();

@ -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>

@ -25,35 +25,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<com.micromobs.android.floatlabel.FloatLabelEditText <EditText
android:id="@+id/reply_name" android:id="@+id/reply_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
floatlabel:fitScreenWidth="full" android:hint="@string/reply_name"
floatlabel:hint="@string/reply_name" android:textSize="16sp"/>
floatlabel:textColorHintFocused="@color/holo_blue_dark"
floatlabel:textColorHintUnFocused="@android:color/darker_gray"
floatlabel:textSize="16sp"/>
<com.micromobs.android.floatlabel.FloatLabelEditText <EditText
android:id="@+id/reply_subject" android:id="@+id/reply_subject"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
floatlabel:fitScreenWidth="full" android:hint="@string/reply_subject"
floatlabel:hint="@string/reply_subject" android:textSize="16sp"/>
floatlabel:textColorHintFocused="@color/holo_blue_dark"
floatlabel:textColorHintUnFocused="@android:color/darker_gray"
floatlabel:textSize="16sp"/>
<com.micromobs.android.floatlabel.FloatLabelEditText <EditText
android:id="@+id/reply_email" android:id="@+id/reply_email"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
floatlabel:fitScreenWidth="full" android:hint="@string/reply_email"
floatlabel:hint="@string/reply_email" android:textSize="16sp"/>
floatlabel:textColorHintFocused="@color/holo_blue_dark"
floatlabel:textColorHintUnFocused="@android:color/darker_gray"
floatlabel:textSize="16sp"/>
<EditText <EditText
android:id="@+id/reply_comment" android:id="@+id/reply_comment"

@ -17,18 +17,6 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<resources> <resources>
<declare-styleable name="FloatLabelEditText">
<attr name="hint" format="string"/>
<attr name="text" format="string"/>
<attr name="textSize" format="dimension"/>
<attr name="textColorHintFocused" format="color"/>
<attr name="textColorHintUnFocused" format="color"/>
<attr name="fitScreenWidth" format="enum">
<enum name="full" value="1"/>
<enum name="half" value="2"/>
</attr>
</declare-styleable>
<attr name="board_pane_style" format="reference"/> <attr name="board_pane_style" format="reference"/>
<attr name="board_pane_left_style" format="reference"/> <attr name="board_pane_left_style" format="reference"/>
<attr name="board_pane_right_style" format="reference"/> <attr name="board_pane_right_style" format="reference"/>

Loading…
Cancel
Save