关于Android瀑布流控件,已经在江湖上,流传已久,超过两年时间了。网上也有很多相关学习资源,可以拿来研究学习。github上,就有两个资源,可以供学习者膜拜。
1.https://github.com/maurycyw/StaggeredGridView 此链接有图片加载功能,但功能相对简单些。
2.https://github.com/etsy/AndroidStaggeredGrid 提供的瀑布流功能强大,可以自定义瀑布流列数。
本篇博客,就讲解etsy的源码为主了。首先看效果图:
首先明确StaggeredGridView中几个变量的定义:
private int mColumnCount; /*程序默认瀑布流的列数,默认情况,通过资源文件中的integers.xml 中grid_column_count定义*/
private int mItemMargin; /*程序默认瀑布流的的margin,通过layout文件activity_sgv.xml中的app:item_margin="8dp"定义*/
private int mColumnWidth; /*程序瀑布流的列宽变量*/
private boolean mNeedSync;
private int mColumnCountPortrait = DEFAULT_COLUMNS_PORTRAIT; /*程序瀑布流竖屏列数*/
private int mColumnCountLandscape = DEFAULT_COLUMNS_LANDSCAPE;/*程序瀑布流横屏列数*/
针对瀑布流,搞清楚如下几个问题,也算是吃透其中的原理了。
1.瀑布流的列数定义好了后,如何计算每列的宽度?
2.瀑布流的列数定义好了后,如何计算每列的高度?
3.瀑布流的HeaderView是如何添加的,其高度宽度如何确定?
4.瀑布流的FooterView是如何添加的,其高度宽度如何确定?
5.点击瀑布流的item时,高亮和默认背景的selector如何来实现?
一.瀑布流的列数定义好了后,如何计算每列的宽度?
进入StaggeredGridActivity界面,瀑布流的UI效果已经出来了,主要看com.etsy.android.grid.StaggeredGridView的onMeasure方法,确定每一个view的尺度.
@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mColumnCount &