我有一种非常肮脏的方式让7个列表盒同步滚动,它们都有完全相同的高度,所以当我移动其中任何一个列表框的位置时,其他6个也应该移动到那个位置。
我所做的是假设ViewportPositionChange()是滚动的,Listbox1是被解雇的,我说
Listbox2.ViewportPosition := NewViewportPosition;
Listbox3.ViewportPosition := NewViewportPosition;
这一切都能工作,我只需将这段代码添加到每个Listboxses ViewportPositionChange()事件中,但是它在Andriod上太快太慢了,我仍然需要能够从任何一个列表框中滚动,但是没有方法来提高滚动的性能吗?
老实说,它并不是非常慢,但你可以感觉到它的速度不太快,而且每个列表箱都可以有很多列表框,每个列表框也可以在这些控件中有一些控件和更多的控件,所以我认为很多重新绘制的工作都完成了,这就是为什么它变得不那么快了。
示例代码
首先,在表单上放置一个Gridpanel布局,添加6列并向每个列表框中添加一个列表框,每个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;
现在在每个列表上,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;
有时列表框项目中可能有更多的控件,但通常情况下,我认为这将是正常的,现在添加几个项并尝试滚动。
发布于 2015-09-20 06:30:22
FMX TListBox有很大的开销,因为每个列表框项目基本上都是一个样式化的组件,被插入到滚动框中。这有利于灵活性,但不利于速度。
在Windows和OSX中,有一些像ScrollWindowEx或NSView.scrollRect + NSView.setNeedsDisplayInRect这样的函数可以通过滚动窗口的一部分而不发出画图消息来帮助提高性能。因此,您只需使列表框的一部分失效。我可以想象Android有类似的东西。但您可能需要修补FMX才能使用它。这可以提高一些性能,但仍然不是一个神奇的开关伟大的性能。类似的方法是在位图中缓存滚动框的内容,然后在滚动时将部分位图复制到屏幕上。
如果您需要非常好的列表框性能,那么您将需要开发自己的列表框,这是为了提高速度而优化的。为了获得所需的性能,我不得不对我的应用程序的OSX版本做这件事。
发布于 2022-08-02 04:57:54
当所有的项目共享相同的视觉结构时,也有TListView用于Fire猴子,这是比TListBox更好的选择。Ray提供了一个教程(2014年的教程),解释了每个教程适合什么:continue=934&v=XHYtwAu5fl4
用于调整滚动行为(以防有帮助),请参阅:Scrolling
https://stackoverflow.com/questions/32631337
复制相似问题