Я разрабатываю приложение галереи, что я хочу, так же, как 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).
Итак, заключительные вопросы :
- Как реализовать анимацию, соответствующую жесту вручную.
- Как реализовать анимацию между различными менеджерами компоновки.