|
发表于 2023-3-3 21:10:03
|
显示全部楼层
监听上拉到顶事件
首先,在STableViewBase中新增函数
float STableViewBase::GetOverscrollAmount() const
{
return Overscroll.GetOverscroll(GetTickSpaceGeometry());
}
在ListView中,实际控制是否能Overscroll的是AllowOverscroll== EAllowOverscroll::Yes。 Overscroll在Tick中根据当前STableViewBase的SpaceGeometry获取List在beginning/end的above/below滚动的距离,并且将该距离传递给SListPanel。
void STableViewBase::Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime )
{
//...
if (AllowOverscroll == EAllowOverscroll::Yes)
{
const float OverscrollAmount = Overscroll.GetOverscroll(GetTickSpaceGeometry());
ItemsPanel->SetOverscrollAmount( OverscrollAmount );
}
}
当上拉ListView到顶时,参数OverscrollAmount为负数。
然后,在UListViewBase的OnTouchEnded函数中获取GetOverscrollAmount()
TSharedRef<SWidget> UListViewBase::RebuildWidget()
{
MyTableViewBase->OnTouchEndedEvent.BindLambda([this](FGeometry MyGeometry, const FPointerEvent& TouchEvent)
{
OnListViewTouchEndedEvent.Broadcast(MyGeometry, TouchEvent);
const float ScrollAmount = MyTableViewBase->GetOverscrollAmount();
if (ScrollAmount < SMALL_NUMBER)
{
OnListPanelReachTop.Broadcast(ScrollAmount); // DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnListPanelReachTop, float, ScrollAmount);
}
});
}
每次TouchEnd结束时判断当前的ScrollAmount是否小于0即可。
新增从顶部添加数据
void UListView::AddItemFromTop(UObject* Item)
{
ListItems.Insert(Item, 0);
TArray<UObject*> Added;
TArray<UObject*> Removed;
Added.Add(Item);
OnItemsChanged(Added, Removed);
RequestRefresh();
} |
|