Android基础控件——EditText的自定义、高仿iOS的UITextField
来源:互联网 发布:tensorflow车牌识别 编辑:程序博客网 时间:2024/06/14 16:55
EditText的自定义、高仿iOS的UITextField
学习,学习,学以致用,让基础控件贴近实战效果
EditText是常用的文本框输入控件,它没有像iOS的UITextField那样,只要一个属性就可以在输入的时候弹出一个清除所有文本的图标,那么我们就要自定义一个,废话不多说,Hensen老师开车啦
iOS的效果
要实现的效果(有点卡,耐心看)
1.1 实现分析
- 使用EditText的setCompoundDrawablesWithIntrinsicBounds()填充图标
- 使用EditText监听TextChangedListener
- 使用Rect监听图标的点击事件
1.2 实现代码
1、成员变量
//用户图标 20x20 具体分辨率根据不同机子适配private Drawable imageUser;//删除图标 15x15 具体分辨率根据不同机子适配private Drawable imageGray;private Context mContext;
2、构造方法
public MyEditText(Context context) { this(context, null);}public MyEditText(Context context, AttributeSet attrs) { this(context, attrs, 0);}public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = context; init(context);}
3、初始化并监听文本变化
private void init(Context context) { imageUser = ContextCompat.getDrawable(context, R.drawable.user); imageGray = ContextCompat.getDrawable(context, R.drawable.gray); //初始化 setImage(); addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { setImage(); } });}private void setImage() { //setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom) //左边图标放置用户图标,右边图标放置删除图标,即第一个参数和第三个参数 if (length() > 0) { setCompoundDrawablesWithIntrinsicBounds(imageUser, null, imageGray, null); } else { setCompoundDrawablesWithIntrinsicBounds(imageUser, null, null, null); }}
4、监听点击事件
public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: //得到手指离开EditText时的X Y坐标 int x = (int) event.getRawX(); int y = (int) event.getRawY(); //创建一个长方形 Rect rect = new Rect(); //让长方形的宽等于edittext的宽,让长方形的高等于edittext的高 getGlobalVisibleRect(rect); //把长方形缩短至右边30dp,约等于(padding+图标分辨率) rect.left = rect.right - dip2px(mContext, 30); //如果x和y坐标在长方形当中,说明你点击了右边的xx图片,清空输入框 if (rect.contains(x, y)) { setText(""); } break; default: break; } return super.onTouchEvent(event);}public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale);}
1.3 布局实现
注意:
- 由于不同机子的分辨率不同,需要对EditText的drawablePadding和Padding做相应的处理
- 由于不同机子的分辨率不同,需要对图标的分辨率进行适配
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <com.handsome.boke2.EditText.MyEditText android:layout_width="200dp" android:layout_height="35dp" android:background="@drawable/bg_gray_border" android:drawablePadding="8dp" android:hint="请输入用户名" android:padding="8dp" /></RelativeLayout>
而这个bg_gray_border其实就是个xml的背景图,代码如下
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ffffff" /> <stroke android:width="0.01dp" android:color="#DEDEDE" /> <corners android:radius="6dp" /></shape>
源码和图标下载
到这里的课程就结束,如果对基础控件感兴趣的朋友可以关注我博客的基础控件系列
阅读全文
2 0
- Android基础控件——EditText的自定义、高仿iOS的UITextField
- FillBlankView:基于EditText的Android自定义补全信息控件,轻松高仿手机支付宝数字密码输入验证
- Android开篇之高仿ios风格的自定义Dialog
- 【Android自定义控件】仿IOS风格的搜索框
- 【Android自定义控件】仿IOS风格的搜索框
- Android自定义控件仿ios的NavigationView(-)
- 自定义控件—仿IOS7适用于Android的滑动开关
- Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现
- 自定义IOS的UITextField
- Android自定义控件——仿ios开关按钮
- Android自定义控件——仿ios开关按钮
- Android自定义控件——仿ios开关按钮
- Android自定义控件——仿ios开关按钮
- 自定义控件之仿IOS的ToggleButton
- 自定义控件之仿IOS的ToggleButton
- Android基础控件——Dialog的自定义,仿淘宝、天猫、京东等商城广告弹窗
- Android 仿QQ控件变色的EditText/TextView
- 自定义Android的EditText实现仿淘宝登录功能
- 在Linux下编译Google leveldb数据库及在C++中操作示例 标签: linux数据库googlec++makefile浏览器 2012-03-14 09:15 955人阅读 评论(0)
- 【Nginx】——反向代理
- Linux中vim操作指令
- MyBatis动态SQL
- 【Linux】下的线程详解
- Android基础控件——EditText的自定义、高仿iOS的UITextField
- 芒果iOS开发之NSComparisonResult比较结果
- 消息机制之文件下载与断点续传,多线程下载
- Spark大神班--涛哥星哥联合BAT大神倾情打造
- oracle常用语句整理
- iOS学习笔记之GCD详解
- 拓扑排序
- Codeforces 814C An impassioned circulation of affection (dp)
- WIN7系统没有USB驱动和以太网驱动如何操作