Контроллер для горизонтальной прокрутки в Unity 5.x и выше.
Из-за того что встроенный контроллер Scroll View в Unity не позволяет гибко удовлетворять потребностям приложения, было решено создать свой контроллер для горизонтальной прокрутки. Этот компонент не зависит от других UI компонентов Unity, но имеет свои ограничения и предназначен для использования как пример.
Пример работы: ![Горизонтальная прокрутка][2]
![Вертикальная прокрутка][3]
Этот компонент состоит из трёх частей:
Контроллер FScrollPage управляет позицией и размерами объектов, реагирует на взаимодействие пользователя, слушает события прокрутки, выполняет эффекты прокрутки и передает событие выбора выбранным объектам FScrollItem.
Для удобства инициализация FScrollPage разделена на два типа: первый автоматически проверяет и маркирует все подобъекты в указанной ноде, а второй требует передачи карты <itemID, item>
и ID выбранного элемента.
Объект FScrollItem предоставляет обратные вызовы для событий "нажатия" и "выбора". При нажатии объект автоматически перемещается в центр и уведомляет FScrollPage о своём выборе.## Управление позиционированием
Полученные подобъекты map<itemID, item> перебираются, создаются соответствующие объекты FScroillObject и устанавливаются общие параметры расположения (центрирование). Инициализируются lastPosition и Position (FScrollObject имеет свойство RectTransform, а также свойства Position и lastPosition, которые используются для записи текущего (или направляемого) положения и информации о последнем положении). Это используется для дальнейшей прокрутки и коррекции положения.
Принцип слайдового прослушивания заключается в том, чтобы активировать слайдовое обнаружение при наличии событий нажатия или перемещения пальца на ползунке. Когда скорость движения превышает пороговое значение, считается, что происходит скольжение. Слайдовое прослушивание прекращается, когда обнаруживается отпускание пальца или указателя с ползунка.Важно отметить, что если прикоснуться к ползунку таким образом, чтобы он перехватил событие клика по элементу, то событие OnPointerDown ползунка не будет вызвано. Вначале я обратился к статье о проникновении в UI события клика: [проникновение в UI события клика][6], но после использования заметил, что при множественном наложении UI возникают проблемы со стеком памяти, что может привести к зависанию редактора. Впоследствии я нашёл более простое решение — реализовал интерфейс события клика в FScrollItem, передавая события нажатия и отпускания напрямую соответствующим событиям контроллера.
public void OnPointerDown(PointerEventData eventData)
{
// Передаем событие
scrollPage.OnPointerDown(eventData);
// Дальнейшая логика
lastPointer = eventData.position;
}
```## Эффект прокрутки и корректировка положения
Прокручивая элементы, контролируем их перемещение в зависимости от скорости прокрутки. После окончания прокрутки скорость плавно уменьшается до нуля. Когда скорость становится меньше определённого порогового значения, выполняется корректировка положения. При этом эффект тряски реализуется с использованием функции замедления `BackEaseOut`.
```csharp
static float BackEaseOut(float t, float b = 0, float c = 1, float d = 1)
{
return c * ((t = t / d - 1) * t * ((1.70158f + 1) * t + 1.70158f) + 1) + b;
}
При корректировке положения сначала определяется ближайший к центру элемент, его ID записывается и передаётся методу прокрутки, затем элемент перемещается в правильное положение при помощи этого метода.
Если вы планируете использовать этот исходный код, вам следует знать следующие недостатки:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )