SlidingScaleTabLayout(3):解决文字动画需要重写PagerAdapter.getItemPosition()的问题

前言

自从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的需求还是很强烈的,所以计划下一个版本解决这个问题。

你可能感兴趣的:(UI开源库推荐,Android,自定义View系列)