TabLayout + ViewPager2 点击 tab 不需要滑动动画
问题:
点击 tab 的时候,期望viewPager2直接切换到其他页面,不需要滑动动画,类似微信切换 tab 的效果
思路:
切换页面是否滑动的关键在于
ViewPagerOnTabSelectedListener->onTabSelected内的
 viewPager.setCurrentItem(tab.getPosition(), smoothScroll);
TabLayoutMediator 是final类  且smoothScroll字段时私有的、我们没法继承重写、但是可以复制源码进行修改
核心思想就是
修改TabLayoutOnPageChangeCallback的onPageScrollStateChanged内逻辑,根据状态来判断当前是否可以滑动
      @Override
        public void onPageScrollStateChanged(final int state) {
            if (state == SCROLL_STATE_DRAGGING) {
                //正在拖动(即为通过左右滑动进行的切换)
                smoothScroll = true;
            } else if (state == SCROLL_STATE_IDLE) {
                //空闲状态(即为通过点击tab进行的切换)
                smoothScroll = false;
            }
            previousScrollState = scrollState;
            scrollState = state;
        }
并且修改ViewPagerOnTabSelectedListener内的逻辑,取消其对内部smoothScroll的初始化,改为直接使用全局的smoothScroll值
private static class ViewPagerOnTabSelectedListener implements TabLayout.OnTabSelectedListener {
      private final ViewPager2 viewPager;
//        private final boolean smoothScroll;
      ViewPagerOnTabSelectedListener(ViewPager2 viewPager, boolean smoothScroll) {
          this.viewPager = viewPager;
//            this.smoothScroll = smoothScroll;
      }
      @Override
      public void onTabSelected(@NonNull TabLayout.Tab tab) {
          viewPager.setCurrentItem(tab.getPosition(), smoothScroll);
      }
      @Override
      public void onTabUnselected(TabLayout.Tab tab) {
          // No-op
      }
      @Override
      public void onTabReselected(TabLayout.Tab tab) {
          // No-op
      }
  }
复制TabLayoutMediator的代码,修改后改名保存就可以当成TabLayoutMediator使用了,并且多了我们修改的特性
参考于:
https://blog.csdn.net/BirdEatBug/article/details/117414954

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号