一. 前言

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

如果不支持,那么paddingmargin(ViewGroup情况)的属性将失效。

  • 对于继承View的控件,padding是在draw()中处理。

  • 对于继承ViewGroup的控件,padding和margin会直接影响measure和layout过程。

三. 多线程直接使用post方式

View的内部本身提供了post系列的方法,完全可以替代Handler的作用,使用起来更加方便、直接。

四. 避免内存泄漏

主要针对View中含有线程或动画的情况:当View退出或不可见时,记得及时停止该View包含的线程和动画,否则会造成内存泄露问题

启动或停止线程/ 动画的方式:

  1. 启动线程/ 动画:使用view.onAttachedToWindow(),因为该方法调用的时机是当包含View的Activity启动的时刻
  1. 停止线程/ 动画:使用view.onDetachedFromWindow(),因为该方法调用的时机是当包含View的Activity退出或当前View被remove的时刻

五. 处理好滑动冲突

当View带有滑动嵌套情况时,必须要处理好滑动冲突,否则会严重影响View的显示效果。