仿IOS风格的搜索框
来源:互联网 发布:淘宝举报假冒商品 编辑:程序博客网 时间:2024/06/07 06:15
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 + ""); } }}
阅读全文
0 0
- 仿IOS风格的搜索框
- 【Android自定义控件】仿IOS风格的搜索框
- 【Android自定义控件】仿IOS风格的搜索框
- 搜索图标居中的搜索框~iOS风格搜索框
- 仿IOS搜索框
- 即拿即用-仿IOS风格的弹出框和对话框
- 一个仿IOS风格的AlertDialog
- Android仿ios风格底部弹框
- 仿ios风格dialog
- 分享一个仿ios风格的AlertDialog的实现
- 仿IOS搜索框简单实现
- Android开篇之高仿ios风格的自定义Dialog
- 仿IOS搜索控件SearchView
- 仿IOS风格侧边栏菜单实现
- JS仿IOS风格对话框源码范例
- Android下的仿iOS搜索 - SearchBar
- 仿ios,网易,京东的搜索界面和功能
- 自定义EditText实现类iOS风格搜索框
- Java面向对象的三大特性
- 编程感受
- spring 注解学习
- JVM(1):Java 类的加载机制
- 通过继承TagSupport编写标签的方法
- 仿IOS风格的搜索框
- HA集群(nginx )
- 计蒜之道 2017 初赛 UCloud 的安全秘钥(中等)
- (Django)对object.all()等大量数据的QuerySet限制内存使用
- 【SVN】消除文件夹与服务器的关联
- spring 注解的学习
- 在win7下安装Ubuntu系统启动驱动
- Android调节屏幕亮度实现代码
- FTP 协议那些事