【Android小白进阶】自定义布局ViewGroup

自定义布局ViewGroup

自定义布局是一个非常基础并且必须掌握的技能,我在学习这个时候也参考了很多博客,后面把笔记记在了有道云里,所以现在要找到原作者有点困难,所以「这不是一篇原创」,来自各大博主的内容,经过我的一些整理而来的。

一、ViewGroup简介

是一个容器,用来包含其他控件,需要重写onMeasure方法测量子控件的宽高和自己的宽高,然后实现onLayout方法摆放子控件。自定义布局和自定义控件是不一样的,布局是根部,用来放置子控件的。
自定义ViewGroup需要三步:
1.继承ViewGroup,覆盖构造方法
2.重写onMeasure方法测量子控件和自身宽高,这边可以设置子view的宽高。
3.实现onLayout方法摆放子控件

onMeasure()

这里写图片描述
这里写图片描述
1.1 widthMeasureSpec、heightMeasureSpec

子类View的这两个参数,由ViewGroup中的layout_width,layout_height和padding以及View自身的layout_margin共同决定。
比如heightMeasureSpec
由高16位(specMode)和低16位(specSize)组成。
这里写图片描述

那么specMode和specSize的作用有是什么呢???

在ViewGroup中,给View分配的空间大小并不是确定的,有可能随着具体的变化而变化,而这个变化的条件就是传到specMode中决定的,specMode一共有三种可能:
MeasureSpec.EXACTLY:(MATCH_PARENT:)父视图希望子视图的大小应该是specSize中指定的。
MeasureSpec.AT_MOST:(WRAP_CONTENT和其他:)子视图的大小最多是specSize中指定的值,也就是说不建议子视图的大小超过specSize中给定的值。
MeasureSpec.UNSPECIFIED:我们可以随意指定视图的大小。
前两者的区别是: size值不用
这里写图片描述

如果要根据viewGroup的宽度修改子view的大小,可以这样写
这里写图片描述
这里写图片描述
这里写图片描述
2、onLayout()
1、View通过layout方法来确认自己在父容器中的位置
2、 ViewGroup通过onLayout 方法来确定View在容器中的位置(主要是计算问题)
这里写图片描述
这里写图片描述

传入参数ltrb理解:表示相对屏幕的左上右下 的距离
这里写图片描述
使用方法:先计算出要讲将子view要放置的地方,然后调用Child.layout(left,top,right,bottom)
绘制出来。这里的left,top,right,bottom是相对于ViewGroup的。


3、补充知识

1.获取ViewGroup的宽高:
这里写图片描述
2、让子view做居中处理
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_31756443/article/details/80729989