PowerfulEditText的介绍和源码解析

来源:互联网 发布:黎明杀机优化 编辑:程序博客网 时间:2024/06/03 16:59

今日科技快讯

近一个月,部分易到用车司机无法提现,用户充值打不到车等问题持续发酵。4月17日,易到创始人周航爆料:“据我所知,易到当前确实存在着资金问题。而这个问题最直接的原因是乐视对易到的资金挪用13亿。”而乐视与易到对此严正声明:“乐视从未挪用过包括用户充值在内的易到任何资金,而且已投入近40亿元资金及大量生态资源,支持易到发展,13亿是以乐视汽车生态内易到为主体取得一笔14亿联合贷款的一部分。”

作者简介

本篇是 Chay_Chan 的第三篇投稿,分享了他自己扩展的EditText,功能十分实用,希望大家喜欢。

Chay_Chan 的博客地址:

http://blog.csdn.net/chay_chan

前言

写博客一方面是为了分享自己的技术和经验,另一方面是为了可以互相学习、交流和进步。最近决定开发一个开源框架,叫做 PowerfulViewLibrary,也就是功能强大的View库,主要是为了方便开发,封装一些常用的控件,下面是其中的 PowerfulEditText 相关介绍和使用。

PowerfulEditText具有的功能

自带清除文本功能

PowerfulEditText 自带清除文本功能,只需在布局文件该 View 属性中添加 funcType,指定为 canClear,就可以自带清除文本功能,使用如下:

运行后,效果如下:

上图所示的删除图标是默认的,当然也可以指定右侧删除按钮的图标,只需添加 drawableRight属性,这里建议使用一个 selector,分别为普通状态和按压状态设置一张图片,这样当按压图标的时候,会有一种按压的状态,selector 的编写如下:

  • 源码分析:

PowerfulEditText 继承于 EditText,这里定义了三种类型,分别是普通类型、自带清除功能类型以及自带查看密码的功能,其中第二个构造方法,也就是只有两个参数的构造方法,里面调用该类的第三个构造方法(带三个参数的构造方法),需要传多一个 int类型 的参数,这里不能像以前定义其他 View 的时候那样直接传一个0,而是要传 Android.R.attr.editTextStyle,否则很多属性不能在XML里面定义。自己的逻辑操作 init()方法,在第三个构造方法调用即可。

在 init() 方法中,我们首先获取到输入框右侧的Drawable对象,通过 getCompoundDrawables()[2] 获取,getCompoundDrawables() 方法是用于获取输入框四个方向图标的方法,返回的类型是一个Drawable数组,数组的元素排序分别是 左(0)上(1)右(2)下(3)四个 Drawable,这里我们需要获取右侧的图标对象,对应的下标为2。先判断右侧图标 mRightDrawable 是否为空,如果为空,并且当前的功能类型为自带清除功能,则使用默认的清除图标,通过调用 getResources().getDrawable() 加载对应的 selector。

通过判断功能类型是否属于带有清除功能的类型,设置右侧图标初始化的时候是否显示,接着设置文本内容变化的监听,通过监听文本内容的变化,判断右侧图标是否要显示。由于此处已经设置 TextWatcher 进行文本的监听,并且在 onTextChanged() 方法中进行了操作,所以在使用 PowfulEditText 的时候,如果需要在文本内容监听中做相应操作,则需要使用自己定义的 TextListener 来进行回调,而不是使用 TextWatcher。

关于输入框右侧图标点击事件的处理,所采用的方法是重写 onTouchEvent() 方法,对触摸响应进行处理,判断触摸的位置是否落在右侧图标的范围内,如果是,则认为是点击了该图标。

当按下的 x值 在 EditText的宽度 - (图标到控件右边的间距 + 图标的宽度)(getTotalPaddingRight()) 和 EditText的宽度 - 图标到控件右边的间距 之间,则认为是点击了图标(如果为了精确计算,可以考虑y值方向的判断)然后进行相应的操作,如果没有设置右侧图标的点击事件,并且当前属于带有清除功能类型,则默认清除文本。

自带密码输入框切换明文密文格式的功能

PowerfulEditText 自带密码输入框切换明文密文格式的功能,目前大多数App密码输入栏一般支持密码明文、密文的显示,如果需要用到该功能,可以将 funcType 中指定为 canWatchPwd,就可以轻松使用这种功能,使用如下:

运行后,效果如下:

  • 源码解析:

同样也是在 onTouchEvent() 方法中做处理,如果当前的功能类型属于查看密码功能类型,则根据 eyeOpen 这个标识进行判断,判断当前是否是明文,如果是,点击后则变成密文,否则变成明文。

关于输入框明文和密文切换的设置有两种方法。

方法一:

方法二:

上述两种方法都可以实现明文密文的切换,但是方法一切换后 EditText 的光标会回到最左侧,所以这里选择使用方法二,个人觉得体验比较好一些。

上图所示的右侧图标是默认的,同样也可以指定开启查看密码的图标和关闭查看密码的图标,只需要在属性eyeOpen中指定开启查看密码引用的图片,在 eyeClosed 中指定关闭查看密码引用的图片即可,如下,更换开启查看密码的图标,如项目默认的图标 ic_launcher

运行后,效果如下:

这样开启查看密码的图标就更换了,如果还需要更换关闭密码查看的图标,可以指定 eyeClose,引用对应的图标。

设置drawableLeft和drawableRight图片大小的功能

原生的 EditText 并不能在属性中指定 drawableLeft 或 drawableRight 图片的大小,所以一般开发的过程中,一些程序员会采用简单粗暴的方法,直接引用一张宽高都很小的图片。但是在不同屏幕分辨率下,兼容性就不是很好,比如在一些屏幕分辨率较高的手机上运行,图标会显得模糊。

PowerfulEditText 可以指定 drawableLeft 和 drawableRight 图片的宽高大小,可以指定为多少个dp,这样在开发的时候,可以在各个分辨率图片文件夹中放入不同尺寸的图标,通过设定图片的宽高属性来限制显示的大小,下面演示一下:

如图,指定了 drawableLeft 的图片为 ic_laucher,图片看起来比较大,这时如果我们想要将其调小,则可以添加 leftDrawableWidth、leftDrawableHeight 指定左侧图片的宽高。

上面代码,指定了 leftDrawableWidth 和 leftDrawableHeight的 大小都为 30dp,运行的效果如下:

可以看到左侧的图标变小了,同样也可以设置右侧图片的宽高,对应的属性是 rightDrawableWidth、rightDrawableHeight。

  • 源码解析:

这里通过 TypedArray 获取XML中配置的对应 leftDrawableWidth、leftDrawableHeight、rightDrawableWidth、rightDrawableHeight 的尺寸大小,如果没有设置这些属性,则默认使用图标的宽和高,然后通过 Drawable.setBounds() 方法,设置右侧图标的宽高,达到改变两侧图标大小的目的。

设置右侧图标点击事件

PowerfulEditText 同样支持右侧图片的点击事件,如果 funcType 指定为 canClear,则默认点击是清除文本。如果需要进行一些额外的操作,则可以设置回调,比如搜索输入框,右侧是一个搜索的按钮,需要为其设置点击事件的回调。

布局文件

Activity

运行结果如下:

上面布局文件中,和普通的 EditText 属性一样,funcType 一共有三个属性,分别是normal(默认)、canClear(带清除功能)、canWatchPwd(带查看密码功能)。如果不指定funcType,则默认是 normal,普通方式。

Activity中,为 PowerfulEditText 设置右侧图片的点击事件,调用 setOnRightClickListener 设置点击后的回调,这里点击后如果有文本内容,则执行搜索逻辑。

这里仅对 EditText 的一些功能进行封装,对于样式的更改,就要靠开发者根据自己的需求进行修改,修改的方式也不难,只要将 background 指定为自己编写的的xml即可。

关于右侧图标点击事件的回调,和上面所讲到的是一致的,是在 onTouchEvent() 方法中,判断触摸范围是否落在右侧图标上,然后判断 OnRightClickListener 是否为 null,如果 不为null,则进行回调。

OnRightClickListener 接口很简单,回调的时候传递当前的 EditText对象,如果需要对右侧图标点击事件进行自己的逻辑处理,则通过调用 setOnRightClickListener() 进行回调。

关于 PowerfulEditText 的相关属性,可以通过查看 attr.xml 便一目了然,如下:

导入方式

在项目根目录下的 build.gradle 中的 allprojects{} 中,添加 jitpack 仓库地址,如下:

打开 app 的 module 中的 build.gradle,在 dependencies{} 中,添加依赖,如下:

这样就可以使用 PowerfulViewLibrary 下的控件了,目前只对 EditText 的一些功能进行了封装,往后会把一些常用的 View 进行封装,方便项目的开发,我会保持对 PowerfulViewLibrary 的更新和维护的,也希望大家可以向我提出一些建议。

项目地址:

https://github.com/chaychan/PowerfulViewLibrary.git

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

阅读全文
0 0
原创粉丝点击