![image-20200330142618611](全能型自定义tabLayout%28全文%29%20.assets/image-20200330142618611.png)
显然他们的交集可能是某个回调监听,顺着这个线索,最终确定,上面的 pageChangeListener
就是 联动滑动的交界点,这里把监听器传给ViewPager,ViewPager则可以把自己的滑动参数传递给TabLayout,TabLayout则做出相应的行为。
监听器的源码为:
private TabLayoutOnPageChangeListener pageChangeListener;
public static class TabLayoutOnPageChangeListener implements ViewPager.OnPageChangeListener {
@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
…
}
@Override
public void onPageSelected(final int position) {
…
}
@Override
public void onPageScrollStateChanged(final int state) {
…
}
}
了解到这里,我们可以给 GreenTabLayuot 直接加上 这个接口实现
class GreenTabLayout : HorizontalScrollView, ViewPager.OnPageChangeListener {
@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
…
}
@Override
public void onPageSelected(final int position) {
…
}
@Override
public void onPageScrollStateChanged(final int state) {
…
}
}
然后提供一个 相同的 setupWithViewPager(viewpager)
方法, 在内部,给ViewPager绑定监听,同时根据 viewPager的adapter内的 page数目,决定TabView的数目和每一个的标题。
fun setupWithViewPager(viewPager: ViewPager) {
this.mViewPager = viewPager
viewPager.addOnPageChangeListener(this)// 注册监听
val adapter = viewPager.adapter ?: return
val count = adapter!!.count // 栏目数量
for (i in 0 until count) {
val pageTitle = adapter.getPageTitle(i)
addTabView(pageTitle.toString())// 根据adapter的item数目,决定TabView的数目和每一个标题
}
}
参数分析
注册监听之后,Viewpager可以把自己的滑动参数的变化告知TabLayout,但是TabLayout如何去处理这个参数变化,还需要从参数的规律上去着手。重点分析 监听的 onPageScrolled
方法, 重点中的重点,则是前两个参数:position