ViewPager中CardView滚动时Elevation(阴影)跳动问题
嘿,我之前也踩过这个ViewPager+CardView阴影跳动的坑!真的超烦,滚动的时候阴影忽大忽小或者突然消失又出现对吧?大概率是这几个原因,给你几个亲测有效的解决办法:
1. 固定CardView的Z轴位置,避免滚动时计算异常
ViewPager的页面切换动画默认会调整页面的Z轴层级,导致CardView的elevation被干扰。最简单的办法就是给CardView直接设置translationZ,把它的Z轴位置固定住,和你的cardElevation值保持一致就行:
在布局里加一行:
android:translationZ="4dp"
或者在代码里动态设置:
cardView.setTranslationZ(getResources().getDimensionPixelSize(R.dimen.card_elevation));
2. 开启CardView的兼容padding,防止阴影被裁剪
很多时候阴影跳动其实是因为滚动时CardView的阴影被父容器裁剪了,开启cardUseCompatPadding可以让CardView自动添加合适的padding,保证阴影完整显示:
card_view:cardUseCompatPadding="true"
同时别忘了给父布局(比如你的FrameLayout)加上android:clipChildren="false",确保子View的阴影不会被父容器切掉:
<FrameLayout ... android:clipChildren="false">
3. 检查并修改ViewPager的PageTransformer
如果你用了自定义的PageTransformer,别在里面修改页面的translationZ或者elevation属性,这些操作会和CardView自身的阴影计算冲突。比如默认的深度动画就会动Z轴,换成只做平移、缩放的简单动画:
viewPager.setPageTransformer(false, new ViewPager.PageTransformer() { @Override public void transformPage(@NonNull View page, float position) { // 只做基础的缩放和平移,不碰Z轴相关属性 float scaleFactor = Math.max(0.9f, 1 - Math.abs(position) * 0.1f); page.setScaleX(scaleFactor); page.setScaleY(scaleFactor); page.setTranslationX(page.getWidth() * -position); } });
4. 升级CardView依赖版本
旧版本的AndroidX/support库的CardView可能存在滚动时阴影计算的bug,把依赖升级到最新版试试:
implementation 'androidx.cardview:cardview:1.1.0'
你可以先试前两个方法,大部分情况下都能解决问题。我当时就是加了translationZ和cardUseCompatPadding就搞定了!
内容的提问来源于stack exchange,提问作者vihkat
相关产品推荐
相关产品推荐

