前言
自从SlidingScaleTabLayout发布以后,收到的最多的反馈:
1、为什么文字切换没有效果?
大部分都是PagerAdapter.getItemPosition()的重写问题,虽然demo里有个例子,但是很明显没有达到我当初的预期。
重写PagerAdapter.getItemPosition()是一个很不优雅的方案,增多了使用者的开发成本,并且很容易出错,我也一直在找解决方案,终于在上周发了1.2.x版本。
正文
解决方案来源于我的同事,在之前的开发任务中,我们的app也加入了Tab文字变化这样的效果,但是任务分到了我的同事,测试的时候有一些小问题分配到了我这,我就拜读了一下他的代码,找到了他的解决办法。
要解决的问题
在1.2.x版本之前,因为我希望能把动画的功能独立维护,并且较少的修改SlidingScaleTabLayout,所以我选择了ViewPager.PageTransformer。所以需要重写:
@Override
public void transformPage(@NonNull View view, final float position) {}
可以看出transformPage方法中只要View和position参数:
view:当前移动的view。
position:当前view距离屏幕中间的比例。
ViewPager.PageTransformer主要是对View设置过度动画,没了解过的朋友可以先去搜索一波。于是尴尬的问题出现了,竟然没有Tab的位置?!!,那我怎么才能找到对应的Tab呢,所以我想到了在view设置位置的tag来解决这个问题。
这种方案确实不太友好,你需要手动指定每一个View的位置,对业务代码有侵入性,修改起来很是蛋疼。
解决方案
使用ViewPager.OnPageChangeListener:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
onPageScrolled有三个参数
1、position:当前滑动的View的位置;
2、positionOffset:当前滑动的View距离中心的比例;
3、positionOffsetPixels:当前滑动的View距离中心的像素;
其中position和positionOffset就是我们需要的,position替换之前的getTag,positionOffset几乎不变,在onPageScrolled加入动画:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
iTabScaleTransformer.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
其他问题
方案改变后,还会有其他遗留问题,这里简要说明一下:
- PageTransformer可能会对每一个View执行(初始化的时候),每次滑动至少是执行两次(每次滑动都是移动了两个页面,所以两次回调,代码分离);
- OnPageChangeListener.onPageScrolled只会在滑动的时候执行,所以需要注意初始化View的状态;
- OnPageChangeListener.onPageScrolled每次滑动只会执行一次,position返回当前滑动的两个View左边的位置,所以需要自己去找下一个View。
- 不要在OnPageChangeListener.onPageSelected更新View的状态,建议放在onPageScrolled中,并且是判断否处于中心;
目前SlidingScaleTabLayout还只能和ViewPager使用,如果你需要自定义的话,要注意以上问题。
总结
以上就是全部内容,我看到还有很多朋友留言询问是否有单独的SlidingScaleTabLayout,不和ViewPager一起使用。看来SlidingScaleTabLayout和自定义ViewPager的需求还是很强烈的,所以计划下一个版本解决这个问题。
网友评论