1.让View支持wrap_content
这是因为直接继承View或者ViewGroup的控件,如果不在onMeasure中对wrap_content做特殊处理。那么当外界在布局中使用wrap_content时就无法达到预期的结果。
2.如果有必要,让自定义的View支持padding,充分考虑margin和padding对ViewGroup的影响
这是因为直接继承View的控件,如果不在draw方法中处理padding,那么padding属性是无法起作用的。另外,直接继承自ViewGroup的控件需要在onMeasure和onLayout中考虑padding和子元素的margin对它造成的影响,不然会导致padding和子元素的margin不起作用。
3.没必要在View中使用handler
这里不是说不能使用handler,而是,基本上没有必要在View中去创建一个新的handler对象,因为View本身有post方法。不过,我们对用handler实现回调也不反对的。
4.View中如果有线程或者动画,需要及时停止,参考下View#onDetachedFromWindow
在这边介绍一下onDetachedFromWindow
这个方法,onDetachedFromWindow
和onAttachedToWindow
是对应的,
onDetachedFromWindow 在View在destroy view的时候调用,所以可以加入取消广播注册等的操作。下面是View的onDetachedFromWindow方法:
/**
* This is called when the view is detached from a window. At this point it
* no longer has a surface for drawing.
*
* @see #onAttachedToWindow()
*/
protected void onDetachedFromWindow() {
//已经从窗口
mPrivateFlags &= ~PFLAG_CANCEL_NEXT_UP_EVENT;
mPrivateFlags3 &= ~PFLAG3_IS_LAID_OUT;
removeUnsetPressCallback();
removeLongPressCallback();
removePerformClickCallback();
removeSendViewScrolledAccessibilityEventCallback();
destroyDrawingCache();
destroyLayer(false);
cleanupDraw();
mCurrentAnimation = null;
}
所以,在这个方法中,我们需要把线程、动画停止,同时释放一些资源,如果不及时处理,是有可能造成内存泄露的。比如,我们的View有对象引用,但是那个View已经从窗体分离了,那个Activity已经消失了,这时候,还是有可能因为View在其他Activity有引用,导致这个View的对象没有被回收,造成内存泄露。
5.View带有滑动嵌套情形时候,需要处理好滑动冲突。
如果有滑动冲突,我们需要合适地去处理滑动冲突,否则会导致View不能正常处理滑动事件,导致我们想要的效果达成不了。