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





















请登录后发表评论
注册
社交帐号登录