美文网首页
自定义View(二)简单的viewgroup

自定义View(二)简单的viewgroup

作者: 键盘上的麒麟臂 | 来源:发表于2017-07-03 19:02 被阅读21次

    <h6>上篇讲了自定义View的简单实现,这章就趁热打铁,讲讲自定义ViewGroup的简单实现。</h6>
    <h4>一、初探</h4>
    和上篇一样,看看ViewGroup的绘制是什么走的。

    image.png

    首先可以看到所有的测量和绘制都是在activity的生命周期走之后再走,然后先进行viewgroup的onMeasure,在进行子View的。因为在父viewgroup的onMeasure中写了
    measureChildren(widthMeasureSpec, heightMeasureSpec);
    如果不加这段代码,则不会出现子View。详细的原理还是先不说,但是从这两个例子你可以知道,写在xml中的view由系统调用完生命周期之后再去绘制,而子View是由父View进行绘制的。

    <b>生命周期——父View测量——子view测量——父View摆放子View——绘画父view ——绘画子view</b>
    </br>
    <h4>二、onMeasure和onLayout</h4>这里就不多讲onDraw了,上一章讲了,套路都一样。
    </br>
    <h6>1、onMeasure</h6>
    onMeasure中需要加measureChildren(widthMeasureSpec, heightMeasureSpec);才能通知子View测量绘画。如果你做出来,你会发现子View的布局会受父布局的影响。所以这个方法里有个需要注意的地方,如果你的viewgroup是打算写死宽高或者match_parent,那当你的子View是固定尺寸时,超过父容器的那部分不会显示。而如果父布局是wrap_content,那最好测量所以子View的尺寸再设置viewgroup的尺寸,这样才能实现wrap_content的效果。
    <b>那么这里就说说如何计算子View的尺寸</b>
    View child = this.getChildAt(i);
    int cw = child.getMeasuredWidth();
    这两行代码就能获取到一个子View的尺寸,加个循环就能获取到所以子View的尺寸。
    <pre>
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    Log.v("yet","爹的onMeasure");
    measureChildren(widthMeasureSpec, heightMeasureSpec);
    int childCount = getChildCount();
    int h = 0;
    if (childCount != 0) {
    for (int i = 0; i < childCount; i++) {
    View child = this.getChildAt(i);
    this.measureChild(child, widthMeasureSpec, heightMeasureSpec);
    if(h< child.getMeasuredHeight()){
    h = child.getMeasuredHeight();
    }
    }
    }
    setMeasuredDimension(500,h);
    }
    </pre>
    我这里做了个例子,viewgroup的宽度为子view的最大宽度,这样viewgroup就能实现一个wrap_content的效果。
    </br>
    <h6>2、onLayout</h6>
    这个方法有五个参数,算是挺多的了,先说下入参的含义。
    changed 该参数指出当前ViewGroup的尺寸或者位置是否发生了改变;left,top,right,bottom 当前ViewGroup相对于其父控件的坐标位置。这个方法的作用简单来说就是摆放view。这里就不举例子了,写法很多,网上也有很多例子。

    <b>总结:这章就讲了自定义viewgroup的onMeasure和onLayout简单用法。</b>

    相关文章

      网友评论

          本文标题:自定义View(二)简单的viewgroup

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