美文网首页
View的自定义

View的自定义

作者: alvinljn321 | 来源:发表于2018-08-06 22:05 被阅读0次

1.onMeasure

测量模式:

// 当父view的模式为EXACITY时,父view强加给子view确切的值//一般是父view设置为match_parent或者固定值的ViewGroup

当父view的模式为AT_MOST时,父view强加给子view一个最大的值。(一般是父view设置为wrap_content)

3 当父view的模式为UNSPECIFIED时,父容器不对view有任何限制,要多大给多大// 多见于ListView、GridView

LinearLayout为wrap则,child只测量一次,如果LinearLayout为match,则child只有weight>0才有可能会测量两次,如果height=0 会测量一次,height不为0会测量两次。如果weight没有值则只测量一次

如果不使用weight属性,LinearLayout会在当前方向上进行一次measure的过程,如果使用weight属性,LinearLayout会避开设置过weight属性的view做第一次measure,完了再对设置过weight属性的view做第二次measure

1.RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure

2.RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。

3.在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。

最后再思考一下文章开头那个矛盾的问题,为什么Google给开发者默认新建了个RelativeLayout,而自己却在DecorView中用了个LinearLayout。因为DecorView的层级深度是已知而且固定的,上面一个标题栏,下面一个内容栏。采用RelativeLayout并不会降低层级深度,所以此时在根节点上用LinearLayout是效率最高的。而之所以给开发者默认新建了个RelativeLayout是希望开发者能采用尽量少的View层级来表达布局以实现性能最优,因为复杂的View嵌套对性能的影响会更大一些。

2 onlayout

setFrame() / setOpticalFrame():确定View自身的位置,通过onLayout()确定子View的布局。

Draw过程

View的绘制过程遵循如下几步:

①绘制背景 background.draw(canvas)

②绘制自己(onDraw)

③绘制Children(dispatchDraw)

④绘制装饰(onDrawScrollBars)

onMeasure()方法:单一View,一般重写此方法,针对wrap_content情况,规定View默认的大小值,避免于match_parent情况一致。ViewGroup,若不重写,就会执行和单子View中相同逻辑,不会测量子View。一般会重写onMeasure()方法,循环测量子View。

onLayout()方法:单一View,不需要实现该方法。ViewGroup必须实现,该方法是个抽象方法,实现该方法,来对子View进行布局。

onDraw()方法:无论单一View,或者ViewGroup都需要实现该方法,因其是个空方法

https://blog.csdn.net/u012792686/article/details/72901531

自定义View一定要有两个参数的构造函数:

Context context, @Nullable AttributeSet attrs

相关文章

网友评论

      本文标题:View的自定义

      本文链接:https://www.haomeiwen.com/subject/wbvrhttx.html