工作一段时间,再看<<Android开发艺术探索>>觉得里面总结的知识还是很好的,自定义view这个章节结合源码看过几次了,这回在博客上简单记录一下:)
View系统的绘制流程会从ViewRoot的performTraversals()方法中开始的,绘制从DecorView开始measure,layout,draw…
自定义view分类
1.extends View 重写onDraw
通常是为了实现不规则的图形
2.extends ViewGroup派生特殊的layout
通常是几种view的组合的时候考虑用,要注意重写onMeasure和OnLayout,里面往往包含子view布局的逻辑
3.extends 特定的View(如TextView)
这种比较常用,重写特定view中的某些函数,达到想要的view效果
4.extends特定的ViewGroup(如LinearLayout)
这种比较常用,重写特定ViewGroup中的某些函数,达到想要的效果
自定义view注意事项
1.让view支持wrap_content
这是因为直接继承view或者viewgroup的控件,如果不在onMeasure中对wrap_content做特殊处理的,那么当外借在不居中使用wrap_content时就无法达到预期效果,而是和设置match_parent的效果是一样的
2.如果要让view支持padding
这是因为直接继承view的控件,如果不在draw方法中处理padding,那么padding属性将无法生效.另外,直接继承viewGroup的控件,如果不在onMeasure和onLayout方法中处理padding和子view之间的margin的影响的话,那么设置padding和子view之间的margin将无效
3.尽量不要在view中使用handler
可以使用view.post系列的方法替代handler的作用,除非必须使用handler来传递消息
4.view中如果有线程或动画的话,需要及时停止,避免内存泄露
view中如果有线程或动画的话,可以在onDetachedFromWindow()这个时机停止,这个方法会在activity退出和view被remove的时候调用.还有在view变得不可见的时候也需要停止线程或动画.
5.view带有嵌套滑动时,要处理好滑动冲突