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号