Перейти к содержанию
  • Регистрация
  • 0
Авторизация  
ra.eremeev

Окончание скроллинга в ListBox

Вопрос

Добрый день!

Подскажите, пожалуйста, возможно ли отловить окончание скроллинга в ListBox. В частности, интересует именно момент "отпускания" (убрали палец от экрана при пролистывании) Listbox.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Стандартным способом никак (или я плохо искал)

Получилось не очень,  но работает.

(на форме только два ListBox-а)

.........

type
  THackListBox = class(TListBox)
  public
    property VScrollBar;
  end;
  THackScrollBar = class(TScrollBar)
  public
    property Track;
  end;

procedure TForm1.FormShow(Sender: TObject);
var
 i : Integer ;
begin
 for i := 0 to 50 do
   ListBox1.Items.Add('Item '+ IntToStr(i));
 for i := 0 to 50 do
   ListBox2.Items.Add('Item '+ IntToStr(i));

 ListBox1.OnVScrollChange := ListBoxVScrollChange;
 ListBox2.OnVScrollChange := ListBoxVScrollChange;
end;

procedure TForm1.EndScrollListBox(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
 ListB : TCustomListBox;
 C : TFmxObject;
begin
 if Sender is TThumb then
 if TThumb(Sender).IsPressed then
 begin
   ListB := nil;
   C := TFmxObject(Sender);
   while C <> nil do
   begin
     C := C.Parent;
     if (C <> nil) and (C is TCustomListBox) then
     begin
       ListB := C as TCustomListBox;
       break;
     end;
   end;

   if ListB <> nil then
     ShowMessage('End tracking scroll Listbox. Name : '+ ListB.Name);
 end;
end;


procedure TForm1.ListBoxVScrollChange(Sender: TObject);
begin
 if Sender is TListBox then
 if not Assigned(THackScrollBar(THackListBox(Sender).VScrollBar).Track.Thumb.OnMouseUp) then
   THackScrollBar(THackListBox(Sender).VScrollBar).Track.Thumb.OnMouseUp := EndScrollListBox;
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, mmover сказал:

Стандартным способом никак (или я плохо искал)

Получилось не очень,  но работает.

(на форме только два ListBox-а)

Большое спасибо!

Странно, что стандартных инструментов нет :(((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Остановился на обработчике события OnMouseUp (итема или его дочерних компонентов - не принципиально). В нем одной строкой :

listbox1.ScrollToItem(listbox1.ItemByIndex(round(listbox1.ViewportPosition.x/listbox1.Width)));

 

Чтобы анимация не "глушила" такое действие (если раскрутить Scrolbox, то событие "пролетит") необходимо ее отключить: 

listbox1.AniCalculations.Animation:=false;

Изменено пользователем ra.eremeev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...