读书笔记--View的工作原理(二)

来源:互联网 发布:势不可挡 网络剧 编辑:程序博客网 时间:2024/05/17 23:53

自定义View须知
1、让View支持wrap_content
这是因为直接继承View或者ViewGroup的控件,如果不在onMeasure中对wrap_content做特殊处理,那么当外界在布局中使用wrap_content时就无法达到预期的效果。
2、如果有必要,让你的View支持padding
这是因为直接继承View的控件,如果不在draw方法中处理padding,那么padding属性是无法起作用的。另外,直接继承自ViewGroup的控件,需要在onMeasure和onLayout中考虑padding和子元素的margin对其造成的影响,不然将导致padding和子元素的margin失效。
3、尽量不要在View中使用Handler,没必要
这是因为View内部本身就提供了post系列的方法,完全可以替代Handler的作用,当然除非你很明确的要使用Handler来发送消息。
4、View中如果有线程或者动画,需要及时停止,参考View#onDetachedFromWindow
这一条也很好理解,如果有线程或者动画需要停止时,那么onDetachedFromWindow是一个很好的时机。当包含此View的Activity退出或者当前View被remove时,View的onDetachedFromWindow方法会被调用,和此方法对应的是onAttachedToWindow,当包含此View的Activity启动时,View的onAttachedToWindow方法会被调用。同时,当View变得不可见时,我们也需要停止线程和动画,如果不及时处理这种问题,有可能会造成内存泄漏。
5、View带有滑动嵌套情景时,需要处理好滑动冲突
如果由华东冲突的话,那么要合适的处理滑动冲突,否则将严重影响View的效果,具体处理请跳转读书笔记–View的事件体系(三)

示例

 @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //如果没有下面这四行代码,则在布局文件中,wrap_content与match_parent没有区别。        final int paddingLeft = getPaddingLeft();        final int paddingRight = getPaddingRight();        final int paddingTop = getPaddingTop();        final int paddingBottom = getPaddingBottom();        //上述这段代码的中心思想就是在绘制的时候,考虑到View四周的空白即可        //其中圆心和半径都会考虑到View四周的padding,从而做相应的调整。        ...    }
0 0
原创粉丝点击