Фон
В приложении Lollipop Phone, когда вы переходите на вкладку "Отреки" или "контакты", и вы пытаетесь прокручивать, первое, что происходит, это изменение размера верхней области, состоящей из недавнего события и окна поиска, как такие как:
Если в RecyclerView было намного больше трех элементов, RecyclerView не будет прокручиваться до тех пор, пока верхняя область может быть уменьшена до минимального размера.
То же самое касается прокрутки: пока верхняя область не полностью увеличена, RecyclerView не будет прокручиваться вверх.
Проблема
Я не могу найти лучший способ реализовать эту функцию.
В частности, у меня проблема с изменением размера верхней области, так что она будет такой же гладкой, как и на Lollipop.
Чтобы упростить, мне нужно изменить размер одной части экрана, а не 2, как показано в приложении для телефона ( "последнее событие" и поисковый запрос).
Что я пробовал
Есть несколько вещей, которые я пытался сделать:
-
сделать RecyclerView таким же большим, как и весь экран, имея поддельный, большой пустой заголовок. когда я прокручиваю, я также устанавливаю "translationY" в реальный контент сверху. У этого есть проблема, показывающая полосу прокрутки как часть верхней области (и я хочу показать полосу прокрутки в нужном месте). Кроме того, это делает его довольно сложным, так как вам приходится обрабатывать другие страницы, которые также прокручивают значения RecyclerViews. Это решение похоже на некоторые сторонние библиотеки, такие как этот (но здесь я использовал а не ImageView, но код почти идентичен).
-
RecyclerView находится ниже верхней области, а прокрутка изменяет layoutParams верхней области, аналогично тому, что я сделал на этом сообщении.
-
то же самое, что и 2, но вместо изменения LayoutParams я изменяю масштаб Y видов.
Для обоих # 2 и # 3 проблема заключается в том, что в некоторых случаях, как только я получаю событие прокрутки + Y в некотором значении, я также получаю прокрутку даже -Y одного и того же значения (и наоборот), делая обработку эффекта изменения размера "прыгающим" (вверх и вниз, даже если пользователь прокручивал красиво).
Мое предположение о том, почему это происходит, заключается в том, что когда я перемещаю RecyclerView, следующее событие, сделанное пользователем, находится на совершенно другой позиции, чем исходная, потому что я изменил способ позиционирования RecyclerView или его размер.
Я попытался использовать setOnTouchListener (даже вместе с GestureDetectorCompat) и setOnScrollListener. Все вызвали ту же странную проблему.
Вопрос
Как решить эту проблему? Почему это происходит, и почему это не всегда происходит?
EDIT: Я попытался изменить # 2, так что вместо обработки события касания RecyclerView я обработаю события касания его контейнера (некоторые LinearLayout). По какой-то причине контейнер не реагировал на события касания, поэтому я заменил его RelativeLayout и поместил представление поверх всего внутри этого макета, который будет реагировать на события касания (и соответственно изменить верхнюю область). Это сработало, но потом я не смог передать события дальше к дочерним представлениям, когда это необходимо.
Я думаю, что лучше всего настроить обработку касания RecyclerView (продлить его). Возможно, добавьте прослушиватель для прокрутки, что, когда RecyclerView собирается прокручивать, он спросит, нормально ли это, и если нет, он не будет прокручиваться до тех пор, пока не будет активировано событие подкраски и reset его состояние.