一. 前言
1. 单一View需要重写的方法
onDraw,在其中绘制View自身的内容。
2. 多个View,ViewGroup需要重写的方法
onMeasure,测量;onLayout,确定位置;onDraw,绘制内容。
3. 自定义属性
① 在 values 目录下创建自定义属性的xml文件。
② 在自定义View的构造方法中加载自定义的Xml文件并解析属性值。
③ 在布局文件中使用自定义属性值。
二. 支持特殊属性
1. 支持 wrap_content
如果不在onMeasure()
中对wrap_content
作特殊处理,那么wrap_content
属性将失效,那么如何支持wrap_content属性呢?
具体原因请看:自定义View-支持wrap_content
2. 支持padding & margin
如果不支持,那么padding
和margin
(ViewGroup情况)的属性将失效。
对于继承View的控件,padding是在draw()中处理。
对于继承ViewGroup的控件,padding和margin会直接影响measure和layout过程。
三. 多线程直接使用post方式
View的内部本身提供了post系列的方法,完全可以替代Handler的作用,使用起来更加方便、直接。
四. 避免内存泄漏
主要针对View中含有线程或动画的情况:当View退出或不可见时,记得及时停止该View包含的线程和动画,否则会造成内存泄露问题。
启动或停止线程/ 动画的方式:
- 启动线程/ 动画:使用
view.onAttachedToWindow()
,因为该方法调用的时机是当包含View的Activity启动的时刻
- 停止线程/ 动画:使用
view.onDetachedFromWindow()
,因为该方法调用的时机是当包含View的Activity退出或当前View被remove的时刻
五. 处理好滑动冲突
当View带有滑动嵌套情况时,必须要处理好滑动冲突,否则会严重影响View的显示效果。