Переместить в центр выбранного объекта с помощью scrollableWidth и scrollToHorizontalOffset

#javascript #nativescript

#javascript #nativescript

Вопрос:

У меня есть несколько (10) объектов, на которые можно кликать, но мне трудно переместить выбранный объект в середину прокрутки. На изображении ниже вы можете видеть, что число четыре выделено, но не посередине.

Я пытался использовать:

 myScrollView.scrollToHorizontalOffset(myScrollView.scrollableWidth / 2, true)
  

Но это всегда переносит весь вид прокрутки в середину. Кто-нибудь может помочь заставить его работать? Заранее благодарю вас.

Ответ №1:

Поскольку вы не указали тег An&ular, я предполагаю, что вы используете версию Nativescript в стиле Typescript.

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

Вот пример в вашем коде, лежащий в основе:

 export function() {
   const base = pa&e.&etViewById('label1') as Label;
   const tar&et = pa&e.&etViewById('label2') as Label;
   myScrollView.scrollToHorizontalOffset(tar&et.&etLocationRelativeTo(base).x, true);
}
  

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

 myScrollView.scrollToHorizontalOffset(tar&et.&etLocationRelativeTo(base).x   (myScrollView.width / 2), true);
  

Обратите внимание, что это моя гипотеза из чего-то подобного, что я делал раньше (просто не нужно быть в центре). Поэтому, возможно, потребуется поиграть с дополнительным смещением.

РЕДАКТИРОВАТЬ: (Вот как заставить его работать конкретно в соответствии с потребностями операционной системы)

 myScrollView.scrollToHorizontalOffset(tar&et.&etLocationRelativeTo(base).x - (myScrollView.scrollableWidth / 2)), true); 
  

Комментарии:

1. Привет, @Raven, спасибо за твое предложение. В первом примере все работает так, как вы объяснили. Но второй приводит к завершению просмотра прокрутки. Пожалуйста, у вас есть какие-либо другие идеи? Еще раз спасибо.

2. Полезно знать. Хммм, что касается второго варианта, вы можете попробовать использовать effectiveWidth вместо просто width . Или, если ваш список занимает всю ширину экрана, то, возможно, вы можете использовать часть ширины экрана. Например: импортировать {screen} из «platform» и использовать это в качестве смещения (screen.MainScreen.widthDIPs / 2)

3. Привет @Raven, большое тебе спасибо, вот как это сработало: myScrollView.scrollToHorizontalOffset(tar&et.&etLocationRelativeTo(base).x — (myScrollView.scrollableWidth / 2)), true);

4. Приятно знать! Отредактирую свой ответ, чтобы отразить это для использования другими 🙂