package com.mm.android.deviceaddmodule.mobilecommon.widget;
|
|
import android.content.Context;
|
import android.graphics.Bitmap;
|
import android.graphics.BitmapFactory;
|
import android.graphics.Canvas;
|
import android.graphics.Paint;
|
import android.graphics.Typeface;
|
import android.text.Editable;
|
import android.text.InputType;
|
import android.text.TextWatcher;
|
import android.util.AttributeSet;
|
import android.view.ActionMode;
|
import android.view.ActionMode.Callback;
|
import android.view.Menu;
|
import android.view.MenuItem;
|
import android.view.MotionEvent;
|
import android.view.View;
|
import android.view.View.OnFocusChangeListener;
|
|
import com.mm.android.deviceaddmodule.R;
|
|
public class ClearPasswordEditText extends android.support.v7.widget.AppCompatEditText implements
|
OnFocusChangeListener, TextWatcher, Callback {
|
|
private Bitmap mClearDrawable, mOpenDrawable, mShutDrawable,
|
mRightDrawable;
|
|
private Paint mPaint;
|
|
private boolean hasFous;
|
|
private boolean mIsClearIconVisible = false;
|
|
private boolean mIsPassWordShut = true;
|
|
private TextWatcher mTextWatcher;
|
|
private ClearEditText.ITextChangeListener mListener;
|
|
/**
|
* 焦点改变监听,提供外部使用
|
*/
|
private ClearEditText.IFocusChangeListener mOnFocusChangeEXListener;
|
|
/**
|
* 设置焦点改变监听
|
*/
|
public void setOnFocusChangeEXListener(ClearEditText.IFocusChangeListener listener) {
|
this.mOnFocusChangeEXListener = listener;
|
}
|
|
@SuppressWarnings("unchecked")
|
public void setTextChangeListener(ClearEditText.ITextChangeListener l) {
|
mListener = l;
|
}
|
|
public void setTextWathcher(TextWatcher textWatcher) {
|
mTextWatcher = textWatcher;
|
}
|
|
public ClearPasswordEditText(Context context) {
|
this(context, null);
|
}
|
|
public ClearPasswordEditText(Context context, AttributeSet attrs) {
|
this(context, attrs, android.R.attr.editTextStyle);
|
}
|
|
|
public ClearPasswordEditText(Context context, AttributeSet attrs,
|
int defStyle) {
|
super(context, attrs, defStyle);
|
init();
|
}
|
|
private void init() {
|
mClearDrawable = BitmapFactory.decodeResource(getResources(),
|
R.drawable.mobile_common_icon_deleteinput);
|
mOpenDrawable = BitmapFactory.decodeResource(getResources(),
|
R.drawable.ic_password_visible);
|
mShutDrawable = BitmapFactory.decodeResource(getResources(),
|
R.drawable.ic_password_invisible);
|
|
mRightDrawable = mShutDrawable;
|
|
setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
setTypeface(Typeface.DEFAULT);
|
|
mPaint = new Paint();
|
mPaint.setAntiAlias(true);
|
//开启安全监控
|
setFilterTouchesWhenObscured(true);
|
|
// 密码输入框为自定义控件,初始化时调用setFilterTouchesWhenObscured(true)接口,开启安全监控
|
setFilterTouchesWhenObscured(true);
|
|
// 设置焦点改变的监听
|
setOnFocusChangeListener(this);
|
|
// 设置输入框里面内容发生改变的监听
|
addTextChangedListener(this);
|
}
|
|
@Override
|
public boolean onTouchEvent(MotionEvent event) {
|
if (event.getAction() == MotionEvent.ACTION_UP) {
|
int x = (int) event.getX();
|
int y = (int) event.getY();
|
|
if (mIsClearIconVisible) {
|
isClearIconChange(x, y);
|
}
|
|
boolean change = isPassWordShutChange(x, y);
|
if (change) {
|
invalidate();
|
}
|
|
}
|
|
return super.onTouchEvent(event);
|
}
|
|
private boolean isPassWordShutChange(int x, int y) {
|
int height = mRightDrawable.getHeight();
|
int distance = (getHeight() - height) / 10;
|
boolean isInnerWidth = x > (getWidth() - mRightDrawable.getWidth() - getPaddingRight() - 5)
|
&& x < (getWidth() - getPaddingRight() + 20);
|
|
boolean isInnerHeight = y > distance - 20 && y < (distance + height) + 20;
|
|
|
|
if (isInnerHeight && isInnerWidth) {
|
int selIndexStart = getSelectionStart();
|
int selIndexStop = getSelectionEnd();
|
mIsPassWordShut = !mIsPassWordShut;
|
if (mIsPassWordShut) {
|
mRightDrawable = mShutDrawable;
|
setInputType(InputType.TYPE_CLASS_TEXT
|
| InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
setTypeface(Typeface.DEFAULT);
|
|
} else {
|
|
mRightDrawable = mOpenDrawable;
|
setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
|
setTypeface(Typeface.DEFAULT);
|
}
|
setSelection(selIndexStart, selIndexStop);
|
return true;
|
}
|
return false;
|
}
|
|
private void isClearIconChange(int x, int y) {
|
int height = mClearDrawable.getHeight();
|
int distance = (getHeight() - height) / 2;
|
boolean isInnerWidth = x > (getWidth() - (mRightDrawable.getWidth()
|
+ mClearDrawable.getWidth() + getPaddingRight() + 10))
|
&& x < (getWidth() - (mRightDrawable.getWidth()
|
+ getPaddingRight() + 10));
|
|
boolean isInnerHeight = y > distance && y < (distance + height);
|
|
if (isInnerHeight && isInnerWidth) {
|
setText("");
|
}
|
}
|
|
@Override
|
protected void onDraw(Canvas canvas) {
|
super.onDraw(canvas);
|
|
|
|
canvas.drawBitmap(mRightDrawable,
|
getScrollX() + getWidth() - mRightDrawable.getWidth() - getPaddingRight(),
|
(getHeight() - mRightDrawable.getHeight()) / 2, mPaint);
|
|
|
if (mIsClearIconVisible) {
|
canvas.drawBitmap(
|
mClearDrawable,
|
getScrollX()+ getWidth()
|
- (mRightDrawable.getWidth()
|
+ mClearDrawable.getWidth()
|
+ getPaddingRight() + 10),
|
(getHeight() - mClearDrawable.getHeight()) / 2, mPaint);
|
}
|
|
}
|
|
public int getCompoundPaddingRight() {
|
int paddingRight = super.getCompoundPaddingRight();
|
|
return paddingRight + mRightDrawable.getWidth() + mClearDrawable.getWidth() + 50;
|
}
|
|
public void setCopyAble(boolean copyAble) {
|
this.setLongClickable(copyAble);
|
if (copyAble) {
|
setCustomSelectionActionModeCallback(null);
|
} else {
|
setCustomSelectionActionModeCallback(this);
|
}
|
}
|
|
@Override
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
return false;
|
}
|
|
@Override
|
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
return false;
|
}
|
|
@Override
|
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
return false;
|
}
|
|
@Override
|
public void onDestroyActionMode(ActionMode mode) {
|
|
}
|
|
@Override
|
public void beforeTextChanged(CharSequence s, int start, int count,
|
int after) {
|
removeTextChangedListener(this);
|
if (mListener != null) {
|
mListener.beforeChanged(this, s, start, count, after);
|
}
|
|
if (mTextWatcher != null) {
|
mTextWatcher.beforeTextChanged(s, start, count, after);
|
}
|
|
addTextChangedListener(this);
|
}
|
|
@Override
|
public void afterTextChanged(Editable s) {
|
removeTextChangedListener(this);
|
if (mListener != null) {
|
mListener.afterChanged(this, s);
|
}
|
|
if (mTextWatcher != null) {
|
mTextWatcher.afterTextChanged(s);
|
}
|
|
addTextChangedListener(this);
|
}
|
|
@Override
|
public void onTextChanged(CharSequence text, int start, int lengthBefore,
|
int lengthAfter) {
|
removeTextChangedListener(this);
|
|
if (mListener != null) {
|
mListener.onTextChanged(this, text, start, lengthBefore,
|
lengthAfter);
|
}
|
|
if (mTextWatcher != null) {
|
mTextWatcher.onTextChanged(text, start, lengthBefore, lengthAfter);
|
}
|
addTextChangedListener(this);
|
|
if (hasFous) {
|
setClearIconVisible(getText().toString().length() > 0);
|
}
|
}
|
|
@Override
|
public void onFocusChange(View v, boolean hasFocus) {
|
this.hasFous = hasFocus;
|
|
if (hasFocus) {
|
setClearIconVisible(getText().length() > 0);
|
} else {
|
setClearIconVisible(false);
|
}
|
|
if(mOnFocusChangeEXListener != null) {
|
mOnFocusChangeEXListener.onClearTextFocusChange(v,hasFocus);
|
}
|
}
|
|
private void setClearIconVisible(boolean b) {
|
mIsClearIconVisible = b;
|
invalidate();
|
}
|
|
public void openEyeMode(boolean open){
|
mIsPassWordShut = !open;
|
if (open) {
|
mRightDrawable = mOpenDrawable;
|
setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
|
setTypeface(Typeface.DEFAULT);
|
} else {
|
mRightDrawable = mShutDrawable;
|
setInputType(InputType.TYPE_CLASS_TEXT
|
| InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
setTypeface(Typeface.DEFAULT);
|
}
|
invalidate();
|
|
}
|
|
}
|