UI需要android和IOS统一,搜索框为IOS风格,在网上找了一个
【Android自定义控件】仿IOS风格的搜索框
在此基础上,对焦点进行了处理,默认不获得焦点,点击以后得到焦点,并弹出软键盘
/**
* 仿IOS搜索框,默认字体居中,点击搜索框,字体移到左侧
*/
public class SearchEditText extends AppCompatEditText implements View.OnFocusChangeListener, View.OnKeyListener, TextWatcher, View.OnClickListener
{
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; // 控件区域
private Context context;
public void setOnSearchClickListener(OnSearchClickListener listener)
{
this.listener = listener;
}
public interface OnSearchClickListener
{
void onSearchClick(View view);
void onTextChanged(String text);
void beforeTextChanged(String text);
void afterTextChanged(String text);
void viewClick();
}
public SearchEditText(Context context)
{
this(context, null);
this.context = context;
init();
}
public SearchEditText(Context context, AttributeSet attrs)
{
this(context, attrs, android.R.attr.editTextStyle);
this.context = context;
init();
}
public SearchEditText(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
this.context = context;
init();
}
private void init()
{
//默认不获取焦点
setFocusable(false);
setOnFocusChangeListener(this);
setOnKeyListener(this);
addTextChangedListener(this);
setOnClickListener(this);
//关闭粘贴复制功能
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
setCustomInsertionActionModeCallback(new ActionMode.Callback()
{
@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)
{
}
});
}
setLongClickable(false);
/* SoftKeyBoardListener.setListener(context, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener()
{
@Override
public void keyBoardShow(int height)
{
}
@Override
public void keyBoardHide(int height)
{ //键盘关闭,搜索框失去焦点,显示正常的列表,隐藏搜索列表,设置上拉下拉可用
setFocusable(false);
clearFocus();
}
});
*/
}
@Override
public void onClick(View v)
{
if (pressSearch)
{
return;
}
if (!isFocused())
{
//点击控件获取焦点,弹出键盘
setFocusableInTouchMode(true);
requestFocus();
isIconLeft = true;
invalidate();
setHint("请输入关键字");
}
setSelectAllOnFocus(false);
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(this, 0);
/*InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);*/
if (listener != null)
{
listener.viewClick();
}
}
@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 (!pressSearch && TextUtils.isEmpty(getText().toString()))
{
isIconLeft = hasFocus;
}
}
//点击取消等操作,复原搜索框
public void setDefault()
{
setFocusable(false);
clearFocus();
setText("");
setHint("搜索");
isIconLeft = false;
pressSearch = false;
invalidate();
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event)
{
pressSearch=false;
//加入&& event.getAction() == KeyEvent.ACTION_DOWN防止执行两次
if (listener != null && event.getAction() == KeyEvent.ACTION_DOWN)
{
pressSearch = (keyCode == KeyEvent.KEYCODE_ENTER);
if (pressSearch)
{
/*隐藏软键盘*/
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive())
{
imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0);
}
listener.onSearchClick(v);
pressSearch = false;
setFocusable(false);
clearFocus();
}
}
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("");
setFocusable(false);
/*隐藏软键盘*/
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive())
{
imm.hideSoftInputFromWindow(this.getApplicationWindowToken(), 0);
}
// listener.onSearchClick(this);
}
}
// 删除按钮被按下时改变图标样式
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.drawable.delete_new);
}
else
{
drawableDel = this.getResources().getDrawable(R.drawable.delete_new);
}
return super.onTouchEvent(event);
}
@Override
public void afterTextChanged(Editable arg0)
{
if (this.length() < 1)
{
drawableDel = null;
}
else
{
drawableDel = this.getResources().getDrawable(R.drawable.delete_new);
}
if (listener != null)
{
listener.afterTextChanged(arg0 + "");
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3)
{
if (listener != null)
{
listener.beforeTextChanged(arg0 + "");
}
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3)
{
if (listener != null)
{
listener.onTextChanged(arg0 + "");
}
}
}