Navigation Fragment间解决元素共享动画

1,914 阅读1分钟

Fragment共享元素过渡的实现

  1. 为每个共享元素视图分配一个唯一的过渡名称
  2. FragmentNavigator 添加共享元素
  3. 设置共享元素过渡动画
  • 给要共享元素分配名称

FragmentA

android:transitionName="search"


<RelativeLayout
    android:id="@+id/search_area_rl"
    android:layout_width="200dp"
    android:layout_height="70dp"
    android:transitionName="search"
    >

FragmenB

android:transitionName="search"

<RelativeLayout
    android:id="@+id/search_rl"
    android:layout_width="700dp"
    android:layout_height="70dp"
    android:transitionName="search"
  • 跳转添加共享元素 FragmentA
FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder()
        .addSharedElement(searchAreaRl, "search")
        .build();
Navigation.findNavController(v).navigate(R.id.action_recipesGatherFragment_to_recipesSearchFragment,null,null,extras);
  • 设置共享元素过渡动画 FragmenB
@Override
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setSharedElementEnterTransition( TransitionInflater.from(requireContext())
            .inflateTransition(R.transition.shared_search));
}

res/transition/shared_search

<transitionSet>
    <changeScroll />
    <changeBounds />
</transitionSet>