自定义View基本法
我们使用手机,是想要获取某些信息,而 View 是这些信息的直接展示界面,因为信息种类繁多,为了更好的展示这些信息, View 也必须有多种多样,Android 系统本身就给我们提供了不少类型的 View,但有时仍不能满足我们的需要,所以有时可能需要自定义 View 来完成任务。
自定义 View 有许多需要注意的地方,关于这些需要注意的内容,我都会整理在这里,其名为《自定义 View 基本法》。
第一条:尽量避免自定义 View。
由于 View 直接承载了与用户交互的重任,所以必须要考虑到各种情况,例如:
- 当没有设置宽高属性时,View 默认应该多大。
- 横竖屏转换时 View 可能重新设定大小,此时应如何处理。
- View 因为特殊情况被销毁后重建,应如何保存和恢复数据。
由于某些情况很特殊,触发条件也特殊,我们简单的实现了一个自定义了一个 View,可能在 99% 的情况下都是正常的,但在某些特殊情况下就会出问题。
而系统提供给我们的组件都是经过千锤百炼的,基本上考虑到了各种特殊情况的处理,所以通常情况下,系统提供给我们的组件稳定性要好一些。所以我的建议是,能使用系统提供的组件的尽量使用系统的。
除此之外,使用系统提供的组件也方便于其他人快速读懂项目,便于交流。
第二条:尽量避免从头开始。
如果一定要使用自定义 View,那么尽量去继承系统已有的组件,并重写其中的部分方法,不要自己从头开始写。例如:图像相关的 View 可以考虑继承 ImageView,容器类 View 可以考虑继承 LinerLayout,RelativeLayout 等,原因同上。
第三条:处理特殊情况。
针对能想到的一些特殊情况进行处理并且测试,尽量保证自定义 View 能适应各种特殊场景。
第四条:留下文档。
程序员有两大痛苦,1、别人写的项目居然没有文档。2、自己写的项目居然要写文档。
虽然有时候文档写起来确实挺麻烦,但是个人建议要留下一份文档,至少要为自己写的程序添加有效的注释,这不仅是方便他人,更重要的是方便自己以后修改项目。
- 于自定义View而言,首先要标明这个自定义View是解决什么问题,有怎样的效果,使用的场景如何。
- 其次要在关键部位标注实现原理。(例如:显示圆形的ImageView,要标明圆形是如何实现的,使用的是遮罩还是剪裁。)
- 避免无效注释 (例如:在onDraw上面标注绘图),大家都知道这个是绘图,但绘制逻辑才是重点,要去标注绘制逻辑。
第五条:面向结果编程。
我们既然使用自定义View,自然是想要实现一些系统组件无法实现的效果,所以要时刻谨记自己所需要的内容,让其中的所有逻辑都为这个结果服务,我自己实现自定义 View 一般有如下步骤:
- 原型,用我能想到的逻辑实现原型(demo),不管其代码复杂度,首先要得到结果,通常情况下,第一份代码可得性和整洁性都比较差。
- 优化,在原型的基础上对代码进行优化,剔除不必要的内容,例如尝试优化逻辑,对与一些重复性的内容抽取函数进行封装,想办法消灭一些中间变量。同时添加上必要注释,让其逻辑更加清晰易懂。
- 测试,对其进行场景测试,尽量保证其正常运行。