2015-09-17 3 views
0

У меня очень грязный способ синхронизации свитков из 7 списков, все они имеют одинаковую высоту, поэтому, когда я перемещаю позицию любого из них, остальные 6 также должны перемещаться в что позицияDelphi/Firemonkey make Listboxses sync прокрутка лучше

что я делаю Предположим listbox1 прокручивается и ViewportPositionChange() обжигают Я говорю

Listbox2.ViewportPosition := NewViewportPosition; 
Listbox3.ViewportPosition := NewViewportPosition; 

и все это работает, и я просто добавить этот код к каждому событию Listboxses ViewportPositionChange(), но его ужасно рывкий и слишком медленный на Андриоде, мне все равно нужно прокручивать l из любого списка, но нет ли способа улучшить производительность свитка?

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

Пример код

Во-первых разместить макет GridPanel на форме, добавить 6 столбцов и добавить ListBox каждый, каждый Listbox представляет день, где Listbox 1 является понедельник, также Совместите их клиенту.

Глобальные переменные

private Glistbox : array[0..6] of TListBox; 

О форме Создать

Glistbox[0] := ListBox1; 
Glistbox[1] := ListBox2; 
Glistbox[2] := ListBox3; 
Glistbox[3] := ListBox4; 
Glistbox[4] := ListBox5; 
Glistbox[5] := ListBox6; 
Glistbox[6] := ListBox7; 

И теперь каждый listboxses OnViewportPositionChange

//Note that this would be for Listbox1 so for listbox 2 it needs to be changed acordingly 
ListBox2.ViewportPosition := NewViewportPosition; 
ListBox3.ViewportPosition := NewViewportPosition; 
ListBox4.ViewportPosition := NewViewportPosition; 
ListBox5.ViewportPosition := NewViewportPosition; 
ListBox6.ViewportPosition := NewViewportPosition; 
ListBox7.ViewportPosition := NewViewportPosition; 

Затем добавить кнопку со следующим кодом:

var 
    mainlayout,item1,item2 : Tlayout; 
    listboxitem : TListBoxItem; 
    myrec,myrec2 : TRectangle; 
    lbl1,lbl2 : TLabel; 
    I: Integer; 
begin 
for I := 0 to 6 do 
begin 
    listboxitem := TListBoxItem.Create(nil); 

    mainlayout := TLayout.Create(nil); 
    mainlayout.Align := TAlignLayout.Client; 
    mainlayout.Parent:= listboxitem; 

    item1 := TLayout.Create(nil); 
    item1.Align:= TAlignLayout.Left; 
    item1.Parent := mainlayout; 

    item2 := TLayout.Create(nil); 
    item2.Align:= TAlignLayout.Right; 
    item2.Parent := mainlayout; 

    myrec := TRectangle.Create(nil); 
    myrec.Align := TAlignLayout.Client; 
    myrec.Parent := item1; 

    myrec2 := TRectangle.Create(nil); 
    myrec2.Align := TAlignLayout.Client; 
    myrec2.Parent := item2; 

    lbl1 := TLabel.Create(nil); 
    lbl1.Align := TAlignLayout.Client; 
    lbl1.TextAlign := TTextAlign.Center; 
    lbl1.Text := '1'; 
    myrec.AddObject(lbl1); 

    lbl2 := TLabel.Create(nil); 
    lbl2.Align := TAlignLayout.Client; 
    lbl2.TextAlign := TTextAlign.Center; 
    lbl2.Text := '2'; 
    myrec2.AddObject(lbl2); 

    Glistbox[I].AddObject(listboxitem); 
    item2.Width:= mainlayout.Width/2; 
end; 

Там иногда может быть больше контроля в ListBoxItem, но в целом я думаю, что это будет нормой, теперь добавьте несколько предметов и попробовать свиток

+3

Рассматривали ли вы использование элемента управления сеткой с семью столбцами? –

+0

К сожалению, я был слишком далеко от кроличьей дыры, чтобы перейти к управлению сеткой, не меняя слишком много другого кода, как я уже сказал, что он не доволен, но теперь он работоспособен –

+0

Другими словами, вы уже решили, t хочу рассмотреть другие варианты. В этом случае, почему задайте вопрос. По крайней мере, честно об этом. Скажите, что вы не можете столкнуться с изменением дизайна, но есть ли какой-то волшебный переключатель, который делает приложение супер шикарным. Как 'Application.AwesomeScrolling: = True'. –

ответ

0

FMX TListBox имеет много накладных расходов, поскольку каждый пункт ListBox в основном это стилизованный компонент, который вставляется в прокрутку. Это полезно для гибкости, но плохо для скорости.

В Windows и OSX есть такие функции, как ScrollWindowEx или NSView.scrollRect + NSView.setNeedsDisplayInRect, которые могут помочь повысить производительность, прокручивая часть окна без выдачи сообщений с краской. Таким образом, вам нужно будет только аннулировать часть списка. Я мог представить, что у Android есть нечто похожее. Но вам, скорее всего, придется исправлять FMX, чтобы использовать это. Это может немного улучшить производительность, но по-прежнему не является волшебным переключателем для отличной производительности. Аналогичный подход будет кэшировать содержимое прокрутки в растровом изображении, а затем скопировать части растрового изображения на экран во время прокрутки.

Если вам действительно нужна хорошая производительность списка, вам необходимо разработать собственный список, оптимизированный для скорости. Это то, что я должен был сделать для OSX-версии моего приложения, чтобы получить требуемую производительность.

Смежные вопросы