如何禁用ViewPager2切换动画,仅通过TabLayout切换页面?
解决ViewPager2点击Tab直接切换Fragment(无滑动动画)的方案
这问题我做项目时也碰到过,要实现点击TabLayout直接切换Fragment、去掉默认的滑动动画,其实只要从控制页面切换动画和调整Tab点击触发逻辑这两个点入手就能搞定,下面一步步来:
1. 确认已禁用ViewPager2的用户输入
先确保你已经关闭了ViewPager2的滑动输入(这一步你应该已经完成了,再确认下):
viewPager2.setUserInputEnabled(false);
2. 自定义无动画的PageTransformer
ViewPager2的页面切换动画由PageTransformer控制,我们可以写一个自定义Transformer,让页面切换瞬间完成,跳过所有过渡效果:
import android.view.View; import androidx.viewpager2.widget.ViewPager2; public class NoAnimationPageTransformer implements ViewPager2.PageTransformer { @Override public void transformPage(View view, float position) { // 强制页面保持完全显示状态,禁用所有过渡动画 view.setAlpha(1f); view.setTranslationX(0f); view.setScaleX(1f); view.setScaleY(1f); } }
把这个Transformer设置给ViewPager2:
viewPager2.setPageTransformer(new NoAnimationPageTransformer());
3. 修改TabLayout点击时的切换行为
默认情况下,TabLayoutMediator绑定Tab和ViewPager2后,点击Tab会触发带平滑滚动的切换(相当于调用setCurrentItem(position, true)),我们需要替换这个逻辑,让它调用setCurrentItem(position, false)来禁用平滑动画:
TabLayout tabLayout = findViewById(R.id.tabLayout); ViewPager2 viewPager2 = findViewById(R.id.viewPager2); // 先完成Tab和ViewPager2的基础绑定(设置Tab文本等内容) new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> { tab.setText("Tab " + (position + 1)); }).attach(); // 替换Tab的选中监听,强制切换时无动画 tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { // 关键:第二个参数设为false,直接切换页面无滑动 viewPager2.setCurrentItem(tab.getPosition(), false); } @Override public void onTabUnselected(TabLayout.Tab tab) { // 空实现即可 } @Override public void onTabReselected(TabLayout.Tab tab) { // 如果需要处理重复点击Tab的逻辑,可在这里添加代码 } });
为什么要同时做这两步?
- 自定义
PageTransformer是从根源上禁用所有页面切换的过渡动画,哪怕是通过代码主动调用切换也不会有动画; - 修改Tab的选中监听则是确保用户点击Tab时,触发的是无平滑滚动的切换逻辑,和FragmentTransaction的即时切换效果完全一致。
这样操作后,点击Tab就能直接显示目标Fragment,完全看不到滑动动画啦~
内容的提问来源于stack exchange,提问作者DenBond
相关产品推荐
相关产品推荐

