SharedElementTransition with Navigation Architecture Component
이 기사는?
SDK 사용
project/build.gradle
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0-alpha02"
app/build.gradleapply plugin: 'androidx.navigation.safeargs.kotlin'
// 省略
implementation "androidx.navigation:navigation-fragment-ktx:2.1.0-alpha02"
단계 요약
일람 화면
postponeEnterTransition()
startPostponedEnterTransition()
TransitionName
TransitionName
addSharedElement
상세 화면
sharedElementEnterTransition
TransitionName
실시
Navigation Graph
xml을 기입한 후 구축합시다.
나중에 필요한 클래스가 생성됩니다.
nav_graph
<?xml version="1.0" encoding="utf-8"?>
<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/home_fragment"
>
<!-- 省略 -->
<!-- 一覧画面 -->
<fragment
android:id="@+id/todo_list_fragment"
android:name="com.helmos.mysandbox.presentation.todo.TodoListFragment"
android:label="TodoListFragment"
tools:layout="@layout/fragment_todo_list"
>
<action
android:id="@+id/start_detail"
app:destination="@id/todo_detail_fragment"
>
<argument
android:name="todo"
app:argType="com.helmos.mysandbox.data.entity.Todo"
/>
<argument
android:name="transition_name"
app:argType="string"
/>
</action>
</fragment>
<!-- 詳細画面 -->
<fragment
android:id="@+id/todo_detail_fragment"
android:name="com.helmos.mysandbox.presentation.todo.detail.TodoDetailFragment"
android:label="TodoDetailFragment"
tools:layout="@layout/fragment_todo_detail"
>
<argument
android:name="todo"
app:argType="com.helmos.mysandbox.data.entity.Todo"
/>
<argument
android:name="transition_name"
app:argType="string"
/>
</fragment>
</navigation>
일람 화면
RecyclerView 사용 방법 등은 생략되었습니다.
TodoListFragment
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 省略
// RecyclerViewのTransitionは遅延させる
postponeEnterTransition()
todoRecycler.viewTreeObserver.addOnPreDrawListener {
startPostponedEnterTransition()
true
}
}
// onBindViewHolder 共有要素にTransitionNameを設定
view.transitionName = "todo_transition_$position"
// 一覧アイテムクリック時の処理
setOnItemClickListener { item, view ->
val todo = (item as TodoItem).todo
val sharedView = view.findViewById<View>(R.id.todo_icon)
// 画面遷移
findNavController().navigate(
// 自動生成されるDirectionsクラス
TodoListFragmentDirections.startDetail(todo, sharedView.transitionName),
// addSharedElementを行ってくれるUtilクラス
FragmentNavigatorExtras(
sharedView to sharedView.transitionName
)
)
}
상세 화면
TodoDetailFragment
// 自動生成される引数データクラス
private val args by navArgs<TodoDetailFragmentArgs>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedElementEnterTransition = TransitionInflater.from(context).inflateTransition(android.R.transition.move)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 省略
// 共有要素に設定
todoImage.transitionName = args.transitionName
}
미혹된 곳
필수
android.R.transition.move
하면, 만약, 만약...Activity->Activity 시 이동하지만 Fragment->Fragment는 동작하지 않음
무슨 제한이 있습니까?
이동만 하면 돼요.
디테일에서 되돌릴 때 애니메이션이 없습니다
RecyclerView 그리기 전에
android.R.transition.move
를 실행하여 문제를 해결합니다.이것도 Activity->Activity 때 설정이 없어도 움직이는데 Fragment 간의 이동이라면 여러 가지 마음대로 달라질까요?
Reference
이 문제에 관하여(SharedElementTransition with Navigation Architecture Component), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Helmos/items/7ba847107ee6c68896ae텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)