注:这篇文章在onmeasure方法的实现上有不合理的地方(见评论),故只能作为一种参考,要当成一个合格控件使用还需要完善。
暴风影音的搜索页面有一个效果,每一行的组件如果最后一个显示即将超出屏幕宽度,则自动换行。效果图:
本demo的效果图:
实现该效果不能使用已有的组件,必须自定义一个布局。
重点介绍:自定义布局可以继承ViewGroup,要想实现该效果,我们的自定义布局里面必须要继承父类中的onMeasurt()和onLayout()两个方法。
onMeasure()方法的作用是设置布局的显示范围,超出该范围的部分将被遮挡.核心代码是:setMeasuredDimension(int width,int height).
onLayout()方法的作用是在父容器内布局子组件,核心功能是根据计算出来的子组件的四个”坐标”将其放在父容器的指定位置,核心代码为:childview.layout(int left,int top,int right,int bottom)
下面贴出Demo源码,算法解释已经在注释中了。
自定义布局:
HorizantalFallWaterLayout.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
.relpost{clear:both}
Tag:
Freenovo 发表于2014-01-10 09:54:00 | 编辑 | 分享 0
引用地址: