android TabLayout+ViewPager2+Fragment关闭平滑滚动动画

abLayout+ViewPager2+Fragment 四个页面以上:当从第一页切换到第四页、会依次从二、三滚动到第四页。页面跨越越多个效果越明显,体验很不好,怎么关闭平滑滚动动画,而是点击tab后直接跳转到相应的页面呢?

        ViewPager的setCurrentItem(int item, boolean smoothScroll)方法smoothScroll=false可以直接跳转,我们可以自定义一个ViewPager重写改方法实现。

        但是ViewPager2是final类,只能另辟蹊径: 我想控制点击TabLayout 使ViewPager2滚动核心是通过TabLayoutMediator进行绑定,先看源码看有三个构造函数:

public TabLayoutMediator(
    @NonNull TabLayout tabLayout,
    @NonNull ViewPager2 viewPager,
    @NonNull TabConfigurationStrategy tabConfigurationStrategy) {
  this(tabLayout, viewPager, /* autoRefresh= */ true, tabConfigurationStrategy);
}

public TabLayoutMediator(
    @NonNull TabLayout tabLayout,
    @NonNull ViewPager2 viewPager,
    boolean autoRefresh,
    @NonNull TabConfigurationStrategy tabConfigurationStrategy) {
  this(tabLayout, viewPager, autoRefresh, /* smoothScroll= */ true, tabConfigurationStrategy);
}

public TabLayoutMediator(
    @NonNull TabLayout tabLayout,
    @NonNull ViewPager2 viewPager,
    boolean autoRefresh,
    boolean smoothScroll,
    @NonNull TabConfigurationStrategy tabConfigurationStrategy) {
  this.tabLayout = tabLayout;
  this.viewPager = viewPager;
  this.autoRefresh = autoRefresh;
  this.smoothScroll = smoothScroll;
  this.tabConfigurationStrategy = tabConfigurationStrategy;
}

可以看出第三个构造函数有smoothScroll入参,TabLayoutMediator类继续往下看这个参数是用来做什么的?

public void attach() {
    if (attached) {
      throw new IllegalStateException("TabLayoutMediator is already attached");
    }
    ……

    // Now we'll add a tab selected listener to set ViewPager's current item
    onTabSelectedListener = new ViewPagerOnTabSelectedListener(viewPager, smoothScroll); // 在被这里传入监听器
    ……
  }

    // 再看看监听器里面的做了什么?
    @Override
    public void onTabSelected(@NonNull TabLayout.Tab tab) {
      viewPager.setCurrentItem(tab.getPosition(), smoothScroll);
    }


    /**
     *设置当前选定的页面。如果{@code smoothScroll=true},将执行平滑
    *从当前项目到新项目的动画。如果未设置适配器,则静默忽略
    *或者是空的。将项夹到适配器的边界。
    *
    *@param item要选择的项目索引
    *@param smoothScroll True可平滑滚动到新项目,false可立即转换
     */
    public void setCurrentItem(int item, boolean smoothScroll) {
        if (isFakeDragging()) {
            throw new IllegalStateException("Cannot change current item when ViewPager2 is fake "
                    + "dragging");
        }
        setCurrentItemInternal(item, smoothScroll);
    }


所以我们可以使用第三个构造函数来关闭平滑滚动效果:

TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(binding.tablayout, binding.viewPager2, true, false, (tab, position) -> {
            // 这里初始化Tab自定义
            tab.setCustomView(R.layout.custom_tab_view);
            
        });

tabLayoutMediator.attach();

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值