Fragment切换滑动动画时加深源Fragment背景色的实现方法咨询
Fragment切换滑动动画时加深源Fragment背景色的实现方法咨询
嘿,这个场景我太懂了!全白背景的Fragment切换时,滑动动画确实没什么层次感,给你几个实用的解决方法:
方法一:给源Fragment添加遮罩层,配合动画渐显
这个方法是在Fragment A的布局上层加一个半透明遮罩,切换时让遮罩慢慢显示,从而达到“变暗”的效果,操作起来很直观:
- 修改Fragment A的布局,在根布局最顶部添加一个初始透明的遮罩View:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 你的原有内容布局 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 这里放Fragment A的内容 --> </LinearLayout> <!-- 遮罩层:初始透明,黑色半透明背景 --> <View android:id="@+id/fragment_mask" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#80000000" <!-- 80%透明度的黑色,可根据需求调整 --> android:alpha="0" /> </FrameLayout>
- 创建遮罩的淡入动画,新建
res/anim/fade_in_mask.xml:
<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:interpolator="@android:anim/decelerate_interpolator" android:fromAlpha="0" android:toAlpha="1" />
- Fragment切换时启动动画,在你执行切换的代码里,同时触发Fragment B的滑动动画和Fragment A的遮罩淡入:
// 获取Fragment A的遮罩View(前提是你能拿到Fragment A的实例) View maskView = fragmentA.getView().findViewById(R.id.fragment_mask); if (maskView != null) { Animation fadeAnim = AnimationUtils.loadAnimation(requireContext(), R.anim.fade_in_mask); maskView.startAnimation(fadeAnim); } // 执行Fragment切换,用你现有的slide_in_right动画 getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right) .replace(R.id.container, fragmentB) .addToBackStack(null) .commit();
注意:当从Fragment B切回Fragment A时,要在Fragment A的onResume方法里把遮罩透明度重置为0,不然遮罩会一直显示:
@Override public void onResume() { super.onResume(); View maskView = getView().findViewById(R.id.fragment_mask); if (maskView != null) { maskView.setAlpha(0); } }
方法二:直接用属性动画修改源Fragment背景色
如果不想加额外的遮罩View,可以用属性动画直接改变Fragment A根布局的背景色透明度,从纯白过渡到深灰:
// 获取Fragment A的根布局 View rootView = fragmentA.getView(); if (rootView != null) { // 从纯白(#FFFFFF)过渡到半透明深灰(#CCFFFFFF,CC代表80%不透明度) ObjectAnimator colorAnimator = ObjectAnimator.ofArgb( rootView, "backgroundColor", Color.WHITE, Color.argb(204, 255, 255, 255) ); colorAnimator.setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime)); colorAnimator.setInterpolator(new DecelerateInterpolator()); colorAnimator.start(); }
同样,切回Fragment A时要在onResume里把背景色恢复:
@Override public void onResume() { super.onResume(); View rootView = getView(); if (rootView != null) { rootView.setBackgroundColor(Color.WHITE); } }
这两种方法都能让Fragment A在切换时明显变暗,和Fragment B的滑动动画形成更好的层次感,你可以根据自己的布局复杂度选适合的~
备注:内容来源于stack exchange,提问作者Nazar Taraniuk
相关产品推荐
相关产品推荐

