android之自定义View和ViewGroup(二)(此篇不讲述代码,只讲述原理和结构,带你走进自定义的世界)

在上一篇文章android之自定义View和ViewGroup分析(一)中,

已经讲过了关于自定义View的实现原理以及实现步骤和相关的方法分析,所以这篇就不讲自定义View了,讲讲自定义ViewGroup,为了以后自己也方便回忆知识,就写下这一篇做个记录吧,也给大家一个参考,最近写博客都是想过想好之后才开始写的,所以不会坑大家的,哈哈。


上篇讲过自定义View主要是重写两个步骤:测量大小(onMeasure方法),绘制(onDraw方法),先测量出需要的大小,然后根据需要的大小画在指定的位置。
对于ViewGroup,其实也是一样的,先测量大小,测量什么大小呢?遍历子View然后调用他们自己的测量方法测量子View的大小,然后再根据子View的大小测量出自己的大小并通过setMeasuredDimension方法设置(注意:也要分测量模式的,测量模式在上篇自定义View已经说过了)。大小测量完成后,再调用onLayout方法来设置子View的位置,比如LinearLayout的orientation如果设置为horizontal表示横向布局,那么在onLayout方法里面就会根据将子View横着一个一个地放置,至于大小再onMearsure方法里面已经测量了子View的大小根据margin之类的确定了大小,所以只需要在onLayout中确定子View的放置位置就行了。有人可能就会问了,画呢?自定义View测好了之后就进行绘制,ViewGroup不需要绘制吗?任何看见的都需要绘制!不绘制你特么怎么显示出来,这个时候就不是onDraw方法进行绘制了,大家知道onDraw方法是对自己的属性进行绘制,所以除非你要对ViewGoup自己的颜色背景之类的进行自定义就可以调用onDraw了,否则只需要调用dispatchDraw方法进行绘制子View,而自定义的时候此方法不需要咋们自己重写设置了,因为ViewGroup会自己调用。


说白了,自定义ViewGroup就是:测量大小,设置子View位置。这样就够了,绘制子View不需要咋们自己绘制了。那么我们来看看相关方法:

首先,onMeasure方法:

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
细心就会发现跟自定义View的onMeasure方法一模一样,没错,是一样的,都是两个参数,还记得自定义View的时候也是这两个参数吧,测量子View大小的时候就是调用measureChild()方法将ViewGoup的这两个widthMeasureSpec和heightMeasureSpec参数传递进去给子View,查看源码你会发现其实measureChild方法里面调用了childView的meansure方法即:

child.measure(childWidthMeasureSpec, childHeightMeasureSpec);

,这个方法就是传递并设置view的测量模式。使用for循环遍历子View,然后测量子View大小,这就是ViewGroup的onMeasure方法的作用,具体实现我就不多说了。本篇是不讲代码的,只说实现逻辑,代码案例会在后面补上。

然后onLayout方法:

@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
    }
一共有5个参数,第一个是代表当前ViewGroup是否发生改变,后面4个参数依次表示,左上右下,即距离父层的左上右下距离。这几个参数没多大用,遍历设置子View的位置时很少用到,一般都是根据需求设置他们的位置,总之,遍历子View然后设置子View的位置就是在此方法中执行的,具体怎么执行的,代码我会在后期案例中进行实现和说明。


发布了33 篇原创文章 · 获赞 49 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/gsw333/article/details/51899089