mirror of
https://gitee.com/openharmony/arkui_ace_engine
synced 2024-10-07 00:13:44 +00:00
修复List组件ScrollTOIndex跳变问题
Signed-off-by: yeyinglong_admin <yeyinglong@hisilicon.com>
This commit is contained in:
parent
e3a3485f69
commit
86f275badd
@ -1309,6 +1309,7 @@ void ListPattern::OnAnimateStop()
|
|||||||
MarkDirtyNodeSelf();
|
MarkDirtyNodeSelf();
|
||||||
isScrollEnd_ = true;
|
isScrollEnd_ = true;
|
||||||
}
|
}
|
||||||
|
scrollTarget_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ListPattern::ScrollTo(float position)
|
void ListPattern::ScrollTo(float position)
|
||||||
@ -1552,9 +1553,10 @@ bool ListPattern::AnimateToTarget(int32_t index, std::optional<int32_t> indexInG
|
|||||||
}
|
}
|
||||||
GetListItemAnimatePos(iter->second.startPos, iter->second.endPos, align, targetPos);
|
GetListItemAnimatePos(iter->second.startPos, iter->second.endPos, align, targetPos);
|
||||||
}
|
}
|
||||||
auto extraOffset = GetExtraOffset();
|
float extraOffset = 0.0f;
|
||||||
if (extraOffset.has_value()) {
|
if (GetExtraOffset().has_value()) {
|
||||||
targetPos += extraOffset.value();
|
extraOffset = GetExtraOffset().value();
|
||||||
|
targetPos += extraOffset;
|
||||||
ResetExtraOffset();
|
ResetExtraOffset();
|
||||||
}
|
}
|
||||||
if (!NearZero(targetPos)) {
|
if (!NearZero(targetPos)) {
|
||||||
@ -1564,6 +1566,9 @@ bool ListPattern::AnimateToTarget(int32_t index, std::optional<int32_t> indexInG
|
|||||||
predictSnapOffset_.reset();
|
predictSnapOffset_.reset();
|
||||||
snapTrigOnScrollStart_ = false;
|
snapTrigOnScrollStart_ = false;
|
||||||
}
|
}
|
||||||
|
if (!indexInGroup.has_value()) {
|
||||||
|
scrollTarget_ = { index, extraOffset, align, targetPos + currentOffset_ };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1692,6 +1697,22 @@ float ListPattern::UpdateTotalOffset(const RefPtr<ListLayoutAlgorithm>& listLayo
|
|||||||
}
|
}
|
||||||
CalculateCurrentOffset(relativeOffset, listLayoutAlgorithm->GetRecycledItemPosition());
|
CalculateCurrentOffset(relativeOffset, listLayoutAlgorithm->GetRecycledItemPosition());
|
||||||
}
|
}
|
||||||
|
if (scrollTarget_) {
|
||||||
|
auto& target = scrollTarget_.value();
|
||||||
|
auto posInfo = posMap_->GetPositionInfo(target.index);
|
||||||
|
if (!Negative(posInfo.mainPos)) {
|
||||||
|
float startPos = posInfo.mainPos - currentOffset_;
|
||||||
|
float targetPos = 0.0f;
|
||||||
|
GetListItemAnimatePos(startPos, startPos + posInfo.mainSize, target.align, targetPos);
|
||||||
|
targetPos += currentOffset_ + target.extraOffset;
|
||||||
|
const float epsilon = 0.1f;
|
||||||
|
if (!NearEqual(relativeOffset + prevOffset, currentOffset_, epsilon) ||
|
||||||
|
!NearEqual(target.targetOffset, targetPos, epsilon)) {
|
||||||
|
target.targetOffset = targetPos;
|
||||||
|
AnimateTo(targetPos, -1, nullptr, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return currentOffset_ - prevOffset;
|
return currentOffset_ - prevOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +43,13 @@ struct ListItemGroupPara {
|
|||||||
int32_t displayEndIndex = -1;
|
int32_t displayEndIndex = -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ListScrollTarget {
|
||||||
|
int32_t index = -1;
|
||||||
|
float extraOffset = 0.0f;
|
||||||
|
ScrollAlign align = ScrollAlign::START;
|
||||||
|
float targetOffset;
|
||||||
|
};
|
||||||
|
|
||||||
class ListPattern : public ScrollablePattern {
|
class ListPattern : public ScrollablePattern {
|
||||||
DECLARE_ACE_TYPE(ListPattern, ScrollablePattern);
|
DECLARE_ACE_TYPE(ListPattern, ScrollablePattern);
|
||||||
|
|
||||||
@ -413,6 +420,7 @@ private:
|
|||||||
std::optional<int32_t> jumpIndexInGroup_;
|
std::optional<int32_t> jumpIndexInGroup_;
|
||||||
std::optional<int32_t> targetIndex_;
|
std::optional<int32_t> targetIndex_;
|
||||||
std::optional<int32_t> targetIndexInGroup_;
|
std::optional<int32_t> targetIndexInGroup_;
|
||||||
|
std::optional<ListScrollTarget> scrollTarget_;
|
||||||
std::optional<float> predictSnapOffset_;
|
std::optional<float> predictSnapOffset_;
|
||||||
std::optional<float> predictSnapEndPos_;
|
std::optional<float> predictSnapEndPos_;
|
||||||
ScrollAlign scrollAlign_ = ScrollAlign::START;
|
ScrollAlign scrollAlign_ = ScrollAlign::START;
|
||||||
|
@ -407,6 +407,15 @@ public:
|
|||||||
return posMap_[startIndex].mainPos - startPos;
|
return posMap_[startIndex].mainPos - startPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PositionInfo GetPositionInfo(int32_t index) const
|
||||||
|
{
|
||||||
|
auto it = posMap_.find(index);
|
||||||
|
if (it == posMap_.end()) {
|
||||||
|
return { -1.0f, -1.0f };
|
||||||
|
}
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
std::pair<int32_t, float> GetStartIndexAndPos() const
|
std::pair<int32_t, float> GetStartIndexAndPos() const
|
||||||
{
|
{
|
||||||
if (posMap_.empty()) {
|
if (posMap_.empty()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user