美文网首页Android开发技术分享
SlidingScaleTabLayout(3):解决文字动画需

SlidingScaleTabLayout(3):解决文字动画需

作者: 珠穆朗玛小王子 | 来源:发表于2020-07-27 11:50 被阅读0次

    前言

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

    相关文章

      网友评论

        本文标题:SlidingScaleTabLayout(3):解决文字动画需

        本文链接:https://www.haomeiwen.com/subject/ewczlktx.html