Android自定义控件(一)自绘控件
由于公司项目的需求,需要绘制一条竖直的间断线作为分割线。这个可坑了爹了,以前只搞过水平的间断线,只要通过shape也可以简单的画出来,但是千万记得把hardwareAccelerated给关了,不然水平的虚线还是会是实线,这个以前也是我趟过的一个坑。那咋办呢,找不到原生的解决方案,不就是一条简单的间断线嘛,还能难住我等程序猿?这个时候,首先联想到的就是自绘控件了。
自绘控件,顾名思义就是控件所展示的内容都是我们自己绘制上去的。所有的绘制操作就是在onDraw()方法里面进行的,当然我们的这个自定义控件都是View的直接子类。比如最常使用的TextView、ImageView就是View的直接子类,也可视作自绘控件,所有的绘图操作也都是在自己的onDraw()中,有兴趣的同学绘图可以去读读这些基本控件的源码。今天第一讲,我们也动手实现我们自己的控件。
直接上代码,比较简洁。
第一步,在attrs.xml中定义控件的属性
定义line_color这个属性主要就是为了控件兼容着想,可以随意定制化间断线的颜色。
第二步、定义DashLine的成员变量
第三步、在构造方法中初始化变量
第四步、绘图
第五步、布局使用
代码比较简洁,也有注释,就不多说了。看下成果
Android自定义控件(二)组合控件
组合控件的意思就是,我们并不需要自己去绘制视图上显示的内容,而只是用系统原生的控件就好了,但我们可以将几个系统原生的控件组合到一起,这样创建出的控件就被称为组合控件。
定义是足够简单明了,下面我们举个例子。比如我们Android中常用的EditText控件,我想对这个控件进行一定的功能扩展,让这个控件有内容输入时出现一个清除内容的按钮,内容为空时隐藏按钮。同时也要有个内容改变监听的回调接口,最后还需要能支持对EditText的属性可以进行一定的自定义。由于今天的代码量可能比之昨天的自绘控件可能会稍稍多点,所以还是直接上代码吧。
一、定义组合控件的属性,包括提示、文字颜色、大小、背景色
二、定义内容回调的接口
三、初始化组合控件MyEditText的成员变量
四、初始化自定义属性以及组合控件的内容
五、设置删除键的点击监听
六、输入框内容监听
七、设置组合控件的两个公有方法
八、大功告成,看如何使用了
好了,终于靠谱了。大家悠着点加载,贴代码没有办法,就是贴截图比较靠谱。请耐心加载后阅读,相信会对你有所帮助。最后看下运行的结果。
Android自定义控件(三)继承控件
源代码,我会放在github上了,地址:https://github.com/JackCho/MyEditText
继承控件是我们Android开发中最重要也是最常使用的控件,它不同于自绘控件和组合控件,它不需要我们自己去重新去实现一个控件。面向对象的一个重要特性就是继承,相信各位同学对继承的了解都已经非常深入了,继承控件理所当然会拥有父类的所有特性。我们去实现一个继承控件的原因,往往是原生控件已经满足不了我们的业务需求,需要我们自己去对原生控件进行定制化的功能扩展。
当然,继承控件的实现目的多种多样,下面举几个常见的例子。比如实现仿IOS平台的具有回弹特性的ScrollView,比如实现嵌套在ScrollView中的ListView,再比如有这么一个需求,显示用户的圆形头像等等。考虑到今天这一讲的内容的复杂性,同时为了能更详尽的理解继承控件的思想,我已经提前写了一个比较通用的网络加载图片的类库来帮助大家理解。大家可以在文章的最后看到Github的代码链接,欢迎fork。下面先简单介绍下这个控件。
SmartImageView是ImageView的直接子类,拥有ImageView的所有特性,同时扩展了加载网络图片的方法。通过SmartImageView可以实现以下的功能。自定义属性方便的设置加载中、加载失败的图片;加载图片成功后,可以把图片缓存到内存和本地,避免下次再次访问网络,加快了速度;启用线程池去加载网络图片,避免开启过多的线程;使用SoftReference去缓存图片,防止内存溢出;最后就是具体的加载实现都是基于接口的,方便使用者的扩展。好了,老王卖瓜也卖完了,言归正传。简单介绍下实现的思路和用法。
一、SmartImage以及实现类WebImage,贴出关键代码
二、设置自定义属性
三、声明SmartImageView的成员变量
四、初始化自定义属性
五、定义并实现网络加载功能,贴出关键代码
六、布局使用
七、代码使用
写在最后,代码精简了再精简,但还是蛮多的,只能贴出关键代码,但是大体的实现思路已经体现出来了。所有的代码我都放在了Github上了,欢迎Pull Request。
地址:https://github.com/JackCho/SmartImageView