GridLayout общий переход элемента не работает правильно - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь создать переход между RecyclerView с GridLayoutManager и фрагментом. Сетка показывает миниатюры пользовательских изображений, и когда я нажимаю на миниатюру, она отображает детали пользователя. Однако когда я касаюсь миниатюры и показываю детали, переход всегда начинается с верхнего левого края экрана, а не с позиции миниатюры.

Как мне начать переход с позиции эскиза?

Это результат, который я хочу:

Expected result

И вот что я получил:

Transition result

А это мой код:

// UsersAdapter.kt
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        ViewCompat.setTransitionName(holder.itemView.picture, "picture_$position")
}

// MasterFragment.kt
// This is called when i click an item in the grid
itemClickSubject.subscribe { position ->
        val user = users[position]
        val transitionName = "picture_$position"

        fragmentManager
                ?.beginTransaction()
                ?.addSharedElement(picture, transitionName)
                ?.replace(R.id.content, DetailsFragment.create(user, transitionName))
                ?.addToBackStack(null)
                ?.commit()
    }.addTo(disposables)

// DetailsFragment.kt
class DetailsFragment : Fragment() {

    companion object {

        fun create(user: User, transitionName: String): DetailsFragment {
            val args = Bundle()
            args.putParcelable("user", user)
            args.putString("transition_name", transitionName)

            val fragment = DetailsFragment()
            fragment.arguments = args

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {                   
                fragment.sharedElementEnterTransition = ChangeBounds()
                fragment.sharedElementReturnTransition = ChangeBounds()
            }

            return fragment
        }

    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_details, container, false).apply {
            val transitionName = arguments?.getString("transition_name", "")
            ViewCompat.setTransitionName(findViewById(R.id.picture), transitionName)
        }
    }

}

1 Ответ

0 голосов
/ 05 сентября 2018

Исходя из кода, которым вы поделились, при условии, что вы поделились всем добавленным кодом, относящимся к переходам с общими элементами, я полагаю, что вам будет не хватать отложенных и возобновленных вызовов переходов с использованием общих элементов.

Изображения, которые мы хотели бы передать, загружаются в сетку и пейджер и требуют времени для загрузки. Чтобы заставить его работать должным образом, нам нужно будет отложить переход, пока участвующие виды не будут готовы (например, выложены и загружены данными изображения).

Для этого мы вызываем postponeEnterTransition () в onCreateView () наших фрагментов, и как только изображение загружается, мы начинаем переход, вызывая startPostponedEnterTransition ().

Примечание: откладывание вызывается как для сетки, так и для фрагментов пейджера для поддержки как прямого, так и обратного переходов при навигации по приложению.

https://android -developers.googleblog.com / 2018/02 / непрерывного разделяемой элемент-transitions.html

Дополнительный ресурс для более глубокого объяснения:

https://www.androiddesignpatterns.com/2015/03/activity-postponed-shared-element-transitions-part3b.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...