package com.lean56.andplug.view;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.Html;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.CycleInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.EditText;
import com.lean56.andplug.R;
/**
* EditText with reset img on the right
* see {http://blog.csdn.net/xiaanming/article/details/11066685}
*
* @auther xiaanming
* @auther Charles
*/
public class ResetEditText extends EditText {
/**
* clear icon drawable
*/
private Drawable resetIcon;
/**
* focus state of EditText
*/
private boolean focused;
public ResetEditText(Context context) {
this(context, null);
}
public ResetEditText(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.editTextStyle);
}
public ResetEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
/**
* init reset icon of the ResetEditText
*/
private void init() {
// get clear drawable
resetIcon = getCompoundDrawables()[2];
if (null == resetIcon) {
resetIcon = getResources().getDrawable(R.drawable.abc_ic_clear_mtrl_alpha);
}
// set clear drawable
resetIcon.setBounds(0, 0, resetIcon.getIntrinsicWidth(), resetIcon.getIntrinsicHeight());
setClearIconVisible(false); // hidden the clear icon in default
// set the focus change listener
setOnFocusChangeListener(new View.OnFocusChangeListener() {
/**
* hidden/show the clear icon with the text length when the focus change
*/
@Override
public void onFocusChange(View v, boolean hasFocus) {
focused = hasFocus;
setClearIconVisible(hasFocus ? getText().length() > 0 : false);
}
});
// set the text changed listener
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
/**
* hidden/show the clear icon in the text changed
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (focused) {
setClearIconVisible(s.length() > 0);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
/**
* show/hidden the clear icon
*
* @param visible
*/
protected void setClearIconVisible(boolean visible) {
Drawable right = visible ? resetIcon : null;
setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
}
/**
* simulate onClickListener with the click position
* as onClickListener was unavailable in EditText
* <p/>
* the position is from
* (width of EditText - total right padding + width of clear icon)
* to
* (width of EditTex - right padding of clear icon)
* <p/>
* and we do not consider vertical orientation
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (getCompoundDrawables()[2] != null) {
/* boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())
&& event.getX() < (getWidth() - getPaddingRight());*/
boolean touchable = event.getX() > (getWidth() - (getTotalPaddingRight() - getCompoundDrawablePadding()))
&& event.getX() < (getWidth() - getPaddingRight());
if (touchable) {
this.setText("");
}
}
}
return super.onTouchEvent(event);
}
/**
* shake the EditText
*
* @param durationMillis Duration in milliseconds
* @param cycles shark times
*/
public void shakeAnimation(long durationMillis, int cycles) {
Animation anim = new TranslateAnimation(0f, 10f, 0f, 0f);
anim.setInterpolator(new CycleInterpolator(cycles));
anim.setDuration(durationMillis);
startAnimation(anim);
}
public void shakeAnimation() {
shakeAnimation(500, 3);
}
/**
* set the error text color
* @param error
*/
@Override
public void setError(CharSequence error) {
super.setError(Html.fromHtml("<font color=#ffffff>" + error + "</font>"));
}
/**
* clear content
*/
public void clear() {
setText("");
}
}