public class IconCenterEditText extends EditText implements View.OnFocusChangeListener, View.OnKeyListener,TextWatcher { private static final String TAG = "SearchEditText"; /** * 图标是否默认在左边 */ private boolean isIconLeft = false; /** * 是否点击软键盘搜索 */ private boolean pressSearch = false; /** * 软键盘搜索键监听 */ private OnSearchClickListener listener; private Drawable[] drawables; // 控件的图片资源 private Drawable drawableLeft, drawableDel; // 搜索图标和删除按钮图标 private int eventX, eventY; // 记录点击坐标 private Rect rect; // 控件区域 public void setOnSearchClickListener(OnSearchClickListener listener) { this.listener = listener; } public interface OnSearchClickListener { void onSearchClick(View view); } public IconCenterEditText(Context context) { this(context, null); init(); } public IconCenterEditText(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.editTextStyle); init(); } public IconCenterEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { setOnFocusChangeListener(this); setOnKeyListener(this); addTextChangedListener(this); } @Override protected void onDraw(Canvas canvas) { if (isIconLeft) { // 如果是默认样式,直接绘制 if (length() < 1) { drawableDel = null; } this.setCompoundDrawablesWithIntrinsicBounds(drawableLeft, null, drawableDel, null); super.onDraw(canvas); } else { // 如果不是默认样式,需要将图标绘制在中间 if (drawables == null) drawables = getCompoundDrawables(); if (drawableLeft == null) drawableLeft = drawables[0]; float textWidth = getPaint().measureText(getHint().toString()); int drawablePadding = getCompoundDrawablePadding(); int drawableWidth = drawableLeft.getIntrinsicWidth(); float bodyWidth = textWidth + drawableWidth + drawablePadding; canvas.translate((getWidth() - bodyWidth - getPaddingLeft() - getPaddingRight()) / 2, 0); super.onDraw(canvas); } } @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus&&pressSearch&&TextUtils.isEmpty(getText().toString())){ isIconLeft=false; pressSearch=false; } // 被点击时,恢复默认样式 if (!pressSearch && TextUtils.isEmpty(getText().toString())) { isIconLeft = hasFocus; } } @Override public boolean onKey(View v, int keyCode, KeyEvent event) { pressSearch = (keyCode ==KeyEvent.KEYCODE_ENTER); if (pressSearch && listener != null) { /*隐藏软键盘*/ InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm.isActive()) { imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0); } listener.onSearchClick(v); } return false; } @Override public boolean onTouchEvent(MotionEvent event) { // 清空edit内容 if (drawableDel != null && event.getAction() == MotionEvent.ACTION_UP) { eventX = (int) event.getRawX(); eventY = (int) event.getRawY(); Log.i(TAG, "eventX = " + eventX + "; eventY = " + eventY); if (rect == null) rect = new Rect(); getGlobalVisibleRect(rect); rect.left = rect.right - drawableDel.getIntrinsicWidth(); if (rect.contains(eventX, eventY)) { setText(""); } } // 删除按钮被按下时改变图标样式 if (drawableDel != null && event.getAction() == MotionEvent.ACTION_DOWN) { eventX = (int) event.getRawX(); eventY = (int) event.getRawY(); Log.i(TAG, "eventX = " + eventX + "; eventY = " + eventY); if (rect == null) rect = new Rect(); getGlobalVisibleRect(rect); rect.left = rect.right - drawableDel.getIntrinsicWidth(); if (rect.contains(eventX, eventY)) drawableDel = this.getResources().getDrawable(R.mipmap.delete_selector); } else { drawableDel = this.getResources().getDrawable(R.mipmap.delete_selector); } return super.onTouchEvent(event); } @Override public void afterTextChanged(Editable arg0) { if (this.length() < 1) { drawableDel = null; } else { drawableDel = this.getResources().getDrawable(R.mipmap.delete_selector); } } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } }
仿IOS风格的android自定义搜索框(可删除)
猜你喜欢
转载自blog.csdn.net/owen_BLAND/article/details/80384639
今日推荐
周排行