RecyclerView: изменение столбцов макета сетки жестом с анимацией - PullRequest
0 голосов
/ 12 февраля 2020

Я разрабатываю приложение галереи, что я хочу, так же, как Google Photos:

  • Изменение столбцов макета сетки с помощью жеста.
  • Анимация по прогрессу жеста, а не один -time.

Что я сделал:

  • Используйте GridLayoutManager.spanCount, чтобы изменить количество столбцы.
  • Используйте ScaleGestureDetector для обнаружения жеста.

Основные коды:

        val scaleGestureDetector = ScaleGestureDetector(requireContext(), object :
                ScaleGestureDetector.SimpleOnScaleGestureListener() {
            override fun onScaleEnd(detector: ScaleGestureDetector) {
                when {
                    abs(detector.scaleFactor) < 0.1 -> return
                    detector.scaleFactor > 1 -> model.minusColumn()
                    else -> model.addColumn()
                }
            }
        })

        model.columns.observe(this) {
            if (layoutManager.spanCount != it) {
                layoutManager.spanCount = it
                val start = layoutManager.findFirstVisibleItemPosition()
                val end = layoutManager.findLastVisibleItemPosition()
                if (start > 0 && end > 0) {
                    adapter.notifyItemRangeChanged(start, end - start)
                }
            }
        }

Проблема в следующем: Анимация, предоставляемая notifyItemRangeChanged, является одноразовой анимацией, она не может следить за ходом жеста. Кроме того, анимация выглядит очень хаотично c.

В дополнение к этому, Google Фото может даже плавно переключаться между различными макетами (Grid, StaggeredGrid).

Итак, заключительные вопросы :

  1. Как реализовать анимацию, соответствующую жесту вручную.
  2. Как реализовать анимацию между различными менеджерами компоновки.
...