片段到活动共享元素的过渡

时间:2020-02-25 00:31:10

标签: android android-fragments android-transitions shared-element-transition

我们有一个Fragment(托管在Activity中),其中包含一个搜索栏(由EditText包裹的CardView)。我们想通过此搜索栏执行到另一个活动的共享元素转换,并在顶部进行相同的搜索。您可能已经在其他应用程序中看到了这种常见模式。

执行初始实现后,向前过渡(从FragmentActivity)看起来很好并且看起来很平滑。但是,当我按下“后退”按钮退出新的Activity时,返回的动画非常混乱。

某些代码:

MyFragment

class MyFragment : BaseFragment() {

    override fun onCreateView(                                                
       inflater: LayoutInflater, container: ViewGroup?,                      
       savedInstanceState: Bundle?                                           
    ): View? {                                                                

        // Inflate view.                                                      
        val view = inflater.inflate(R.layout.my_fragment, container, false)                                                                                                        
        view.search_input.setOnClickListener {                                 
            var intent = Intent(activity, SearchActivity::class.java) 
            val options = ActivityOptionsCompat.makeSceneTransitionAnimation( 
                activity!!,                                                   
                view.search_wrapper as View,                                  
               "search"                                                      
            )                                                                 
            activity!!.startActivity(intent, options.toBundle())              
      }                                                                     

      return view                                                           
    }
}                                                                         

my_fragment.xml

<ConstraintLayout>
    <androidx.cardview.widget.CardView                             
      android:id="@+id/search_wrapper"                           
      android:transitionName="search"                            
      android:clickable="true"
      ...>                                  

      <EditText                                                  
          android:focusable="false"                              
          android:cursorVisible="false"                          
          android:inputType="none"                               
          android:clickable="false"                                                             
          ... />                         
    </androidx.cardview.widget.CardView> 
</ConstraintLayout>

SearchActivity

class SearchActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search)
    }
    override fun onBackPressed() {
        supportFinishAfterTransition()
    }
}

activity_search.xml

<androidx.constraintlayout.widget.ConstraintLayout>
    <FrameLayout
        app:layout_constraintTop_toTopOf="parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ....>
        <androidx.cardview.widget.CardView
            android:id="@+id/search_wrapper"
            android:transitionName="search"
            ...>

            <EditText
                android:id="@+id/search_input"
                ... />
        </androidx.cardview.widget.CardView>

    </FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

最后,<item name="android:windowContentTransitions">true</item>设置为我们的AppTheme风格。

随附的是展示问题的简短视频。

Imgur

问题

  1. 实际上支持从FragmentActivity的共享元素转换吗?
  2. 为什么返回的动画很混乱,如何补救?

0 个答案:

没有答案