其实世上本没有桶排这个名词,只是百度、Pinterest等用了,所以就有了。观察百度图片,可以得出桶排的一个描述:所有图片保持基本的比例来显示,并且每一行的高度一样,所有行的高度基本一致。
然而在手机上,这三个约束条件是不能同时满足的,因为要保证所有行的高度一致,每一行的图片数量可能会很多,而手机宽度太小,每一行多于3张图片,基本图片就太小了,看不清了,所以在手机上,只能满足前两个条件:所有图片保持基本的比例,每一行的高度相同。
其实实现很简单,利用RecyclerView和GridLayoutManager,GridLayoutManager.setSpanSizeLookup方法,来实现每一个view的宽度。所以我们要做的工作,就是来计算每一个item的span值。
首先定义一个item的数据类型:
private classInfo {
//图片路径
public String path;
public int width;
public int height;
//span值
public int spanCount;
//宽高比
public float wh;
//显示的高度
public int showHeight;
}
我们要做的工作,就是根据图片的宽高,来计算spanCount和showHeight,计算的基本流程如下:
1.遍历当前列表,计算宽高比
2.遍历当前列表,查看当前的item是否可以插入当前组中,如果能插入,则继续,如果不能插入,则把这一组当作一行,计算其span和高度
3.重复2,直到最后一个元素。
代码如下:
canInsertMore函数也很简单,就是计算当前group内的最小span是否超过最小值,或者个数是否超过设定值,或者高度是否太小,如果都不满足,则可以插入,否则可以继续插。
reTrimGroup函数更简单,原理是根据每个item的wh的比例,计算当前span的值,然后根据宽高比,得到showHeight。
最后结果如下:
网友评论