Update
This commit is contained in:
@@ -114,15 +114,16 @@ EXACTLY | 01 | 表示父控件已经确切的指定了子View的大
|
|||||||
AT_MOST | 10 | 表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。
|
AT_MOST | 10 | 表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。
|
||||||
|
|
||||||
#### 关于 onMeasure中的参数(widthMeasureSpec, heightMeasureSpec)在不同模式下是这样的:
|
#### 关于 onMeasure中的参数(widthMeasureSpec, heightMeasureSpec)在不同模式下是这样的:
|
||||||
|
|
||||||
以数值1080(二进制为: 1111011000)为例(其中模式和实际数值是连在一起的,为了展示我将他们分开了):
|
以数值1080(二进制为: 1111011000)为例(其中模式和实际数值是连在一起的,为了展示我将他们分开了):
|
||||||
|
|
||||||
名称 | 模式 | 实际数值
|
模式名称 | 模式数值 | 实际数值
|
||||||
--- | --- | ---
|
------------| --------:| ---
|
||||||
UNSPECIFIED | 00 | 000000000000000000001111011000
|
UNSPECIFIED | 00 | 000000000000000000001111011000
|
||||||
EXACTLY | 01 | 000000000000000000001111011000
|
EXACTLY | 01 | 000000000000000000001111011000
|
||||||
AT_MOST | 10 | 000000000000000000001111011000
|
AT_MOST | 10 | 000000000000000000001111011000
|
||||||
|
|
||||||
实际上关于上面的东西了解即可,在实际运用之中只需要记住有三种模式,用 MeasureSpec 的 getSize是获取数值, getMode是获取模式即可。
|
**PS: 实际上关于上面的东西了解即可,在实际运用之中只需要记住有三种模式,用 MeasureSpec 的 getSize是获取数值, getMode是获取模式即可。**
|
||||||
|
|
||||||
#### 注意:
|
#### 注意:
|
||||||
如果对View的宽高进行修改了,<b>不要调用super.onMeasure(widthMeasureSpec,heightMeasureSpec);</b>
|
如果对View的宽高进行修改了,<b>不要调用super.onMeasure(widthMeasureSpec,heightMeasureSpec);</b>
|
||||||
@@ -133,8 +134,9 @@ AT_MOST | 10 | 000000000000000000001111011000
|
|||||||
### 3.确定View大小(onSizeChanged)
|
### 3.确定View大小(onSizeChanged)
|
||||||
这个函数在视图大小发生改变时调用:
|
这个函数在视图大小发生改变时调用:
|
||||||
|
|
||||||
#### Q: 在测量完View并使用setMeasuredDimension函数之后View的大小基本上已经确定了,那么为什么还要再次确定View的大小呢?
|
**Q: 在测量完View并使用setMeasuredDimension函数之后View的大小基本上已经确定了,那么为什么还要再次确定View的大小呢?**
|
||||||
#### A: 这是因为View的大小不仅由View本身控制,而且受父控件的影响,所以我们在确定View大小的时候最好使用系统提供的onSizeChanged回调函数。
|
|
||||||
|
**A: 这是因为View的大小不仅由View本身控制,而且受父控件的影响,所以我们在确定View大小的时候最好使用系统提供的onSizeChanged回调函数。**
|
||||||
|
|
||||||
onSizeChanged如下:
|
onSizeChanged如下:
|
||||||
``` java
|
``` java
|
||||||
@@ -151,24 +153,27 @@ onSizeChanged如下:
|
|||||||
|
|
||||||
### 4.确定子View布局位置(onLayout)
|
### 4.确定子View布局位置(onLayout)
|
||||||
|
|
||||||
<b>确定布局的函数是onLayout,它用于确定子View的位置,在自定义ViewGroup中会用到,他调用的是子View的layout函数。</b>
|
**确定布局的函数是onLayout,它用于确定子View的位置,在自定义ViewGroup中会用到,他调用的是子View的layout函数。**
|
||||||
|
|
||||||
不过关于View的layout函数我们一般无需关注,因为在一般情况下我们只需关注View自身的坐标系即可,除非View状态与在父VIew所处位置相关。
|
不过关于View的layout函数我们一般无需关注,因为在一般情况下我们只需关注View自身的坐标系即可,除非View状态与在父VIew所处位置相关。
|
||||||
|
|
||||||
在自定义ViewGroup中,onLayout一般是循环取出子View,然后经过计算得出各个子View位置的坐标值,然后用以下函数设置子View位置。
|
在自定义ViewGroup中,onLayout一般是循环取出子View,然后经过计算得出各个子View位置的坐标值,然后用以下函数设置子View位置。
|
||||||
|
|
||||||
``` java
|
``` java
|
||||||
child.layout(l, t, r, b);
|
child.layout(l, t, r, b);
|
||||||
```
|
```
|
||||||
四个参数分别为:
|
四个参数分别为:
|
||||||
|
|
||||||
名称 | 说明 | 对应的函数
|
名称 | 说明 | 对应的函数
|
||||||
--- | --- | ---
|
---- | -------------------------- | ---
|
||||||
l | View左侧距父View左侧的距离 | getLeft();
|
l | View左侧距父View左侧的距离 | getLeft();
|
||||||
t | View顶部距父View顶部的距离 | getTop();
|
t | View顶部距父View顶部的距离 | getTop();
|
||||||
r | View右侧距父View左侧的距离 | getRight();
|
r | View右侧距父View左侧的距离 | getRight();
|
||||||
b | View底部距父View顶部的距离 | getBottom();
|
b | View底部距父View顶部的距离 | getBottom();
|
||||||
具体可以参考 [坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/%E5%9D%90%E6%A0%87%E7%B3%BB/%E5%9D%90%E6%A0%87%E7%B3%BB.md) 这篇文章:
|
|
||||||

|
具体可以参考 [坐标系]https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md) 这篇文章。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
PS:关于onLayout这个函数在讲解自定义ViewGroup的时候会详细讲解。
|
PS:关于onLayout这个函数在讲解自定义ViewGroup的时候会详细讲解。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user