自定义View,也可以称为自定义控件,通过自定义View可以使得控件实现各种定制的效果。
实现自定义View,需要掌握View的底层工作原理,比如View的测量过程、布局流程以及绘制流程,除此之外,还需要掌握View常见的回调方法。而对于那些具有滑动效果的自定义View,我们还需要处理View的滑动,如果遇到滑动冲突则需要处理相应的滑动冲突。
下面是View的常见回调方法:
构造方法
onAttach
onVisibilityChanged
onDetach
onFinishInflate
onSizeChanged
onMeasure
onLayout
onTouchEvent
自定义控件的实现手段可简要分为四种类:
继承View重写onDraw方法,这种方法主要是用于实现一些不规则的效果,采用这种方式需要自己支持wrap_content,并且处理padding。
继承ViewGroup派生特殊的Layout,这种方法主要是用于实现自定义的布局,当某种效果看起来像是几个View组合在一起时,可以采用这种方法来实现。采用这种方法是需要合理处理ViewGroup的测量和布局这两个过程,并同时处理子元素的测量和布局过程。
继承特定的View,用于拓展已有的View的功能。
继承特定的ViewGroup(如LinearLayout、RelativeLayout),其适用情形和方法2 类似。
在自定义View中需要的注意点:
应当遵守Android标准控件的规范(如命名、可配置、事件处理、状态保存及恢复等)
命名表意明确
控件属性可以在XML中配置
让View支持wrap_content和padding(下文会具体讲到)
在View中尽量不使用Handler,因为View中自带post系列的方法。
自定义View的内存泄漏问题(如果有线程或者动画,需要及时停止)
View的滑动冲突(在View带有滑动嵌套的情形,需要处理好滑动冲突)
具有一定的交互性,如按下、点击等
自定义View内部实现状态保存和恢复的机制
兼容性