問題
AndroidのSharedElementで遷移前の画面と遷移後の画面をクロスフェードさせたいと考えています。
以下のサンプルGIFを見ていただけたらわかると思いますが、遷移前の画面(青ボタン)から遷移後の画面(ピンク背景)に遷移する際、ボタンを押した直後からピンク背景となってしまいます。反対に、戻る場合においてもonBackPressedがコールされた瞬間から青背景となってしまっています。つまり、遷移の間に紫?背景となるような動作をしたいと考えています。
試したこと
MaterialContainerTransformが考えていることに近いのでこちらを試してみましたが、共有要素は1つだけに限定されており、以下のような動作をしたい場合は、共有要素を外枠だけに限定しなければなりません。(以下はSampleというTextViewも共有要素に指定しています)
加えてFragment.sharedElementEnterTransitionにFadeのTransitionを指定してみましたが、ルートレイアウトのConstraintLayoutのalphaが0からフェードするだけで透過背景とはなりませんでした。
皆様のお知恵をお貸しください。よろしくお願いします。
コード
FirstFragment
Kotlin
1class FirstFragment: Fragment(R.layout.fragment_first) { 2 3 private var binding by autoCleared<FragmentFirstBinding>() 4 5 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 6 binding = FragmentFirstBinding.bind(view) 7 8 binding.button.setOnClickListener { 9 findNavController().navigate( 10 FirstFragmentDirections.actionFirstFragmentToSecondFragment(), 11 FragmentNavigatorExtras(binding.button to binding.button.transitionName, binding.text to binding.text.transitionName) 12 ) 13 } 14 } 15}
SecondFragment
Kotlin
1class SecondFragment: Fragment(R.layout.fragment_second) { 2 3 private var binding by autoCleared<FragmentSecondBinding>() 4 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 8 val transition = TransitionSet().apply { 9 addTransition(ChangeBounds()) 10 addTransition(ChangeTransform()) 11 addTransition(ChangeImageTransform()) 12 } 13 14 sharedElementEnterTransition = transition 15 sharedElementReturnTransition = transition 16 } 17 18 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 19 binding = FragmentSecondBinding.bind(view) 20 } 21}
環境
・Kotlin 1.6.21
・AndroidX Core 1.7.0
・Navigation Components 2.4.1
注意
StackOverflowとのマルチポストとなります。
解決後、どちらのサイトにも解決方法を記載します。
サンプルGIF

あなたの回答
tips
プレビュー