android中实现UIColletionView瀑布流布局的思路如下:
1. 计算每一列的高度,保存至数组columnHeights中。
2. 根据collectionView的宽度和列数,计算每一列的宽度,保存至columnWidths数组中。
3. 获取要添加的子项View的高度height。
4. 找到columnHeights数组中最短的那一列的索引index。
5. 修改columnHeights数组中index索引对应的高度为原高度+height。
6. 设置子项View的布局参数为:- 高度:height
– 宽度:columnWidths[index]
– 纵坐标:之前第index列的总高度减去height
– 横坐标:index * (columnWidths[index] + 列间距)7. 重复步骤3-6,添加后续子项View。基于上述思路,可以封装一个UICollectionViewFlowLayout的子类来实现瀑布流布局:
public class WaterfallFlowLayout extends UICollectionViewFlowLayout { private int[] columnHeights; private int[] columnWidths; private int columnNumber = 2; private int columnSpacing = 10; @Override public void prepareLayout() { super.prepareLayout(); // 计算每一列的宽度和高度 columnWidths = new int[columnNumber]; columnHeights = new int[columnNumber]; int columnWidth = (int) ((getWidth() - (columnNumber - 1) * columnSpacing) / columnNumber); for (int i = 0; i < columnNumber; i++) { columnWidths[i] = columnWidth; columnHeights[i] = 0; } } @Override public boolean shouldInvalidateLayout(UICollectionView collectionView, int i) { return true; } @Override public CollectionView.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { int height = lp.height; // 获取子项高度 int minHeightIndex = 0; // 最短列的索引 for (int i = 0; i < columnNumber; i++) { if (columnHeights[i] < columnHeights[minHeightIndex]) { minHeightIndex = i; } } columnHeights[minHeightIndex] += height; // 最短列的高度增加 // 设置子项布局参数 int left = minHeightIndex * (columnWidths[minHeightIndex] + columnSpacing); int top = columnHeights[minHeightIndex] - height; int right = left + columnWidths[minHeightIndex]; int bottom = columnHeights[minHeightIndex]; return new Rect(left, top, right, bottom); } }
该类继承自UICollectionViewFlowLayout,在prepareLayout()方法中计算每列的宽高,在生成子项布局参数时找到最短列并设置对应的布局参数,从而实现瀑布流布局效果。
© 版权声明
本文刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等部门来源于互联网,版权均归原作者所有!本网站提供的内容服务于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
联系信息:邮箱aoxolcom@163.com或见网站底部。
联系信息:邮箱aoxolcom@163.com或见网站底部。
THE END
请登录后发表评论
注册
社交帐号登录