How to implement shared transition element from RecyclerView item to Fragment with Android Navigation Component?

前端 未结 5 1570
梦如初夏
梦如初夏 2020-12-30 06:38

I have a pretty straightforward case. I want to implement shared element transition between an item in recyclerView and fragment. I\'m using androi

5条回答
  •  误落风尘
    2020-12-30 07:11

    Android material design library contains MaterialContainerTransform class which allows to easily implement container transitions including transitions on recycler-view items. See container transform section for more details.

    Here's an example of such a transition:

    // FooListFragment.kt
    
    class FooListFragment : Fragment() {
        ...
    
        private val itemListener = object : FooListener {
            override fun onClick(item: Foo, itemView: View) {
                ...
    
                val transitionName = getString(R.string.foo_details_transition_name)
                val extras = FragmentNavigatorExtras(itemView to transitionName)
                navController.navigate(directions, extras)
            }
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            // Postpone enter transitions to allow shared element transitions to run.
            // https://github.com/googlesamples/android-architecture-components/issues/495
            postponeEnterTransition()
            view.doOnPreDraw { startPostponedEnterTransition() }
    
            ...
        }
    
    // FooDetailsFragment.kt
    
    class FooDetailsFragment : Fragment() {
        ...
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            sharedElementEnterTransition = MaterialContainerTransform().apply {
                duration = 1000
            }
        }
    }
    

    And don't forget to add unique transition names to the views:

    
    
    ...
    
    
    
    ...
    
    
    
        ...
        foo_item_transition_%1$s
        foo_details_transition
    
    

    The full sample is available on GitHub.

    You can also take a look at Reply - an official android material sample app where a similar transition is implemented, see HomeFragment.kt & EmailFragment.kt. There's a codelab describing the process of implementing transitions in the app, and a video tutorial.

提交回复
热议问题