!21413 修复Navigation闪烁问题

Merge pull request !21413 from tsj_2020/master
This commit is contained in:
openharmony_ci 2023-11-20 08:42:14 +00:00 committed by Gitee
commit 86f977ee9f
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
10 changed files with 115 additions and 80 deletions

View File

@ -247,27 +247,6 @@ void NavigationGroupNode::AddBackButtonIconToNavDestination(const RefPtr<UINode>
}
}
void NavigationGroupNode::SetBackButtonVisible(const RefPtr<UINode>& navDestinationNode, bool isVisible)
{
auto navDestination = AceType::DynamicCast<NavDestinationGroupNode>(navDestinationNode);
CHECK_NULL_VOID(navDestination);
auto titleBarNode = AceType::DynamicCast<TitleBarNode>(navDestination->GetTitleBarNode());
CHECK_NULL_VOID(titleBarNode);
auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
CHECK_NULL_VOID(titleBarLayoutProperty);
auto backButtonNode = AceType::DynamicCast<FrameNode>(titleBarNode->GetBackButton());
CHECK_NULL_VOID(backButtonNode);
auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty<LayoutProperty>();
CHECK_NULL_VOID(backButtonLayoutProperty);
if (isVisible) {
backButtonLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
} else {
backButtonLayoutProperty->UpdateVisibility(VisibleType::GONE);
}
backButtonNode->MarkModifyDone();
navDestination->UpdateTitleFontSize(isVisible);
}
void NavigationGroupNode::SetBackButtonEvent(
const RefPtr<NavDestinationGroupNode>& navDestination, const RefPtr<NavRouterPattern>& navRouterPattern)
{

View File

@ -110,7 +110,6 @@ public:
void SetBackButtonEvent(const RefPtr<NavDestinationGroupNode>& navDestination,
const RefPtr<NavRouterPattern>& navRouterPattern = nullptr);
void AddBackButtonIconToNavDestination(const RefPtr<UINode>& navDestinationNode);
void SetBackButtonVisible(const RefPtr<UINode>& navDestinationNode, bool isVisible = true);
void ExitTransitionWithPop(const RefPtr<FrameNode>& node);
void ExitTransitionWithPush(const RefPtr<FrameNode>& node, bool isNavBar = false);

View File

@ -555,16 +555,6 @@ bool NavigationPattern::OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& di
// considering backButton visibility
auto curTopNavDestination = AceType::DynamicCast<NavDestinationGroupNode>(
NavigationGroupNode::GetNavDestinationNode(curTopNavPath->second));
if (navigationStack->Size() == 1 &&
(pattern->GetNavigationMode() == NavigationMode::SPLIT ||
navigationLayoutProperty->GetHideNavBar().value_or(false))) {
// cases that backButton of navDestination is gone when there's only one child and
// 1. In SPLIT mode, it's the first level page
// 2. In STACK mode, the navBar is hidden
navigationGroupNode->SetBackButtonVisible(curTopNavDestination, false);
} else {
navigationGroupNode->SetBackButtonVisible(curTopNavDestination, true);
}
pattern->UpdateContextRect(curTopNavDestination, navigationGroupNode);
}
// considering navBar visibility
@ -601,10 +591,6 @@ void NavigationPattern::UpdateContextRect(
CHECK_NULL_VOID(navBarNode);
auto navigationPattern = AceType::DynamicCast<NavigationPattern>(hostNode->GetPattern());
CHECK_NULL_VOID(navigationPattern);
auto size = curDestination->GetGeometryNode()->GetFrameSize();
curDestination->GetRenderContext()->ClipWithRRect(
RectF(0.0f, 0.0f, size.Width(), size.Height()), RadiusF(EdgeF(0.0f, 0.0f)));
curDestination->GetRenderContext()->UpdateTranslateInXY(OffsetF { 0.0f, 0.0f });
if (navigationPattern->GetNavigationMode() == NavigationMode::STACK) {
curDestination->GetRenderContext()->SetActualForegroundColor(DEFAULT_MASK_COLOR);

View File

@ -30,6 +30,7 @@
#include "core/components_ng/pattern/navigation/title_bar_node.h"
#include "core/components_ng/pattern/navigation/title_bar_pattern.h"
#include "core/components_ng/pattern/navrouter/navdestination_group_node.h"
#include "core/components_ng/pattern/navrouter/navdestination_pattern.h"
#include "core/components_ng/pattern/navrouter/navdestination_layout_property.h"
#include "core/components_ng/pattern/text/text_layout_property.h"
#include "core/components_ng/property/layout_constraint.h"
@ -49,7 +50,7 @@ constexpr int32_t MENU_OFFSET_RATIO = 9;
void TitleBarLayoutAlgorithm::MeasureBackButton(LayoutWrapper* layoutWrapper, const RefPtr<TitleBarNode>& titleBarNode,
const RefPtr<TitleBarLayoutProperty>& titleBarLayoutProperty)
{
auto backButtonNode = titleBarNode->GetBackButton();
auto backButtonNode = AceType::DynamicCast<FrameNode>(titleBarNode->GetBackButton());
CHECK_NULL_VOID(backButtonNode);
auto index = titleBarNode->GetChildIndexById(backButtonNode->GetId());
auto backButtonWrapper = layoutWrapper->GetOrCreateChildByIndex(index);
@ -58,6 +59,19 @@ void TitleBarLayoutAlgorithm::MeasureBackButton(LayoutWrapper* layoutWrapper, co
// navDestination title bar
if (titleBarLayoutProperty->GetTitleBarParentTypeValue(TitleBarParentType::NAVBAR) ==
TitleBarParentType::NAV_DESTINATION) {
if (!showBackButton_) {
constraint.selfIdealSize = OptionalSizeF(0.0f, 0.0f);
auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty();
PaddingProperty padding;
padding.SetEdges(CalcLength(Dimension(0.0f, DimensionUnit::VP)));
backButtonLayoutProperty->UpdatePadding(padding);
backButtonWrapper->Measure(constraint);
return;
}
auto buttonLayoutProperty = backButtonNode->GetLayoutProperty();
PaddingProperty padding;
padding.SetEdges(CalcLength(BUTTON_PADDING));
buttonLayoutProperty->UpdatePadding(padding);
if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
constraint.selfIdealSize = OptionalSizeF(static_cast<float>(BACK_BUTTON_ICON_SIZE.ConvertToPx()),
static_cast<float>(BACK_BUTTON_ICON_SIZE.ConvertToPx()));
@ -101,7 +115,7 @@ float TitleBarLayoutAlgorithm::GetTitleWidth(const RefPtr<TitleBarNode>& titleBa
auto isCustom = navDestination->GetPrevTitleIsCustomValue(false);
float occupiedWidth = 0.0f;
// left padding
if (GetNavigationBackButtonState(titleBarNode)) {
if (showBackButton_) {
occupiedWidth += isCustom ? (maxPaddingStart_ + BACK_BUTTON_ICON_SIZE + BUTTON_PADDING).ConvertToPx() :
(maxPaddingStart_ + BACK_BUTTON_ICON_SIZE + NAV_HORIZONTAL_MARGIN_L).ConvertToPx();
} else {
@ -311,7 +325,10 @@ void TitleBarLayoutAlgorithm::LayoutBackButton(LayoutWrapper* layoutWrapper, con
// navDestination title bar
if (titleBarLayoutProperty->GetTitleBarParentTypeValue(TitleBarParentType::NAVBAR) ==
TitleBarParentType::NAV_DESTINATION) {
if (!titleBarNode->GetBackButton()) {
if (!showBackButton_) {
SizeF size = SizeF(0.0f, 0.0f);
geometryNode->SetFrameSize(size);
backButtonWrapper->Layout();
return;
}
if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
@ -377,7 +394,7 @@ void TitleBarLayoutAlgorithm::LayoutTitle(LayoutWrapper* layoutWrapper, const Re
auto isCustom = navDestination->GetPrevTitleIsCustomValue(false);
// add sdk 9 compatible
if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
if (GetNavigationBackButtonState(titleBarNode)) {
if (showBackButton_) {
geometryNode->SetMarginFrameOffset(OffsetF {
static_cast<float>((maxPaddingStart_ + BACK_BUTTON_ICON_SIZE +
NAV_HORIZONTAL_MARGIN_M).ConvertToPx()), offsetY });
@ -388,7 +405,7 @@ void TitleBarLayoutAlgorithm::LayoutTitle(LayoutWrapper* layoutWrapper, const Re
titleWrapper->Layout();
return;
}
if (GetNavigationBackButtonState(titleBarNode)) {
if (showBackButton_) {
auto offsetX = isCustom ? (maxPaddingStart_ + BACK_BUTTON_ICON_SIZE + BUTTON_PADDING).ConvertToPx() :
(maxPaddingStart_ + BACK_BUTTON_ICON_SIZE + NAV_HORIZONTAL_MARGIN_L).ConvertToPx();
offsetY = isCustom ? 0.0f : offsetY;
@ -546,7 +563,7 @@ void TitleBarLayoutAlgorithm::LayoutSubtitle(LayoutWrapper* layoutWrapper, const
if (titleBarLayoutProperty->GetTitleBarParentTypeValue(TitleBarParentType::NAVBAR) ==
TitleBarParentType::NAV_DESTINATION) {
// subtitle doesn't support custom title
if (GetNavigationBackButtonState(titleBarNode)) {
if (showBackButton_) {
if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
geometryNode->SetMarginFrameOffset(OffsetF {
(maxPaddingStart_ + BACK_BUTTON_ICON_SIZE + NAV_HORIZONTAL_MARGIN_M).ConvertToPx(), offsetY });
@ -694,7 +711,17 @@ void TitleBarLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper)
const auto& padding = layoutWrapper->GetLayoutProperty()->CreatePaddingAndBorder();
MinusPaddingToSize(padding, size);
InitializeTheme();
do {
if (layoutProperty->GetTitleBarParentTypeValue(TitleBarParentType::NAVBAR) !=
TitleBarParentType::NAV_DESTINATION) {
break;
}
auto navDestinationNode = AceType::DynamicCast<FrameNode>(titleBarNode->GetParent());
CHECK_NULL_BREAK(navDestinationNode);
auto navDestinationPattern = AceType::DynamicCast<NavDestinationPattern>(navDestinationNode->GetPattern());
CHECK_NULL_BREAK(navDestinationPattern);
showBackButton_ = navDestinationPattern->GetBackButtonState();
} while (0);
MeasureBackButton(layoutWrapper, titleBarNode, layoutProperty);
MeasureMenu(layoutWrapper, titleBarNode, layoutProperty);
auto titleMaxWidth = GetTitleWidth(titleBarNode, layoutProperty, size);
@ -736,12 +763,4 @@ void TitleBarLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper)
LayoutMenu(layoutWrapper, titleBarNode, layoutProperty, subtitleHeight);
}
bool TitleBarLayoutAlgorithm::GetNavigationBackButtonState(const RefPtr<TitleBarNode>& titleBarNode)
{
auto backButton = AceType::DynamicCast<FrameNode>(titleBarNode->GetBackButton());
CHECK_NULL_RETURN(backButton, false);
auto layoutProperty = backButton->GetLayoutProperty();
CHECK_NULL_RETURN(layoutProperty, false);
return layoutProperty->GetVisibilityValue(VisibleType::VISIBLE) == VisibleType::VISIBLE;
}
} // namespace OHOS::Ace::NG

View File

@ -110,8 +110,6 @@ private:
void LayoutMenu(LayoutWrapper* layoutWrapper, const RefPtr<TitleBarNode>& titleBarNode,
const RefPtr<TitleBarLayoutProperty>& titleBarLayoutProperty, float subtitleHeight);
bool GetNavigationBackButtonState(const RefPtr<TitleBarNode>& titleBarNode);
// set variables from theme
void InitializeTheme();
@ -128,6 +126,7 @@ private:
bool isInitialSubtitle_ = true;
float minTitleHeight_ = 0.0f;
float menuWidth_ = 0.0f;
bool showBackButton_ = false;
ACE_DISALLOW_COPY_AND_MOVE(TitleBarLayoutAlgorithm);
};

View File

@ -22,9 +22,9 @@
#include "base/utils/utils.h"
#include "core/components_ng/base/frame_node.h"
#include "core/components_ng/pattern/linear_layout/linear_layout_property.h"
#include "core/components_ng/pattern/navigation/navigation_layout_algorithm.h"
#include "core/components_ng/pattern/navigation/title_bar_layout_property.h"
#include "core/components_ng/pattern/navigation/title_bar_node.h"
#include "core/components_ng/pattern/navigation/navigation_layout_algorithm.h"
#include "core/components_ng/pattern/navrouter/navdestination_group_node.h"
#include "core/components_ng/pattern/navrouter/navdestination_layout_property.h"
#include "core/components_ng/property/layout_constraint.h"
@ -52,24 +52,24 @@ float MeasureTitleBar(LayoutWrapper* layoutWrapper, const RefPtr<NavDestinationG
}
if (navDestinationLayoutProperty->HasTitleBarHeight()) {
auto titleHeight = static_cast<float>(navDestinationLayoutProperty->GetTitleBarHeightValue().
ConvertToPxWithSize(constraint.percentReference.Height()));
auto titleHeight =
static_cast<float>(navDestinationLayoutProperty->GetTitleBarHeightValue().ConvertToPxWithSize(
constraint.percentReference.Height()));
constraint.selfIdealSize.SetHeight((titleHeight));
titleBarWrapper->Measure(constraint);
return titleHeight;
}
auto titleHeight = navDestinationLayoutProperty->GetTitleBarHeightValue(hostNode->GetSubtitle() ?
DOUBLE_LINE_TITLEBAR_HEIGHT : SINGLE_LINE_TITLEBAR_HEIGHT);
constraint.selfIdealSize = OptionalSizeF(size.Width(),
static_cast<float>(titleHeight.ConvertToPxWithSize(constraint.percentReference.Height())));
auto titleHeight = navDestinationLayoutProperty->GetTitleBarHeightValue(
hostNode->GetSubtitle() ? DOUBLE_LINE_TITLEBAR_HEIGHT : SINGLE_LINE_TITLEBAR_HEIGHT);
constraint.selfIdealSize = OptionalSizeF(
size.Width(), static_cast<float>(titleHeight.ConvertToPxWithSize(constraint.percentReference.Height())));
titleBarWrapper->Measure(constraint);
return static_cast<float>(titleHeight.ConvertToPxWithSize(constraint.percentReference.Height()));
}
float MeasureContentChild(LayoutWrapper* layoutWrapper, const RefPtr<NavDestinationGroupNode>& hostNode,
const RefPtr<NavDestinationLayoutProperty>& navDestinationLayoutProperty, const SizeF& size,
float titleBarHeight)
const RefPtr<NavDestinationLayoutProperty>& navDestinationLayoutProperty, const SizeF& size, float titleBarHeight)
{
auto contentNode = hostNode->GetContentNode();
CHECK_NULL_RETURN(contentNode, 0.0f);
@ -143,10 +143,18 @@ void NavDestinationLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper)
MinusPaddingToSize(padding, size);
float titleBarHeight = MeasureTitleBar(layoutWrapper, hostNode, navDestinationLayoutProperty, size);
float contentChildHeight = MeasureContentChild(layoutWrapper, hostNode,
navDestinationLayoutProperty, size, titleBarHeight);
float contentChildHeight =
MeasureContentChild(layoutWrapper, hostNode, navDestinationLayoutProperty, size, titleBarHeight);
size.SetHeight(titleBarHeight + contentChildHeight);
layoutWrapper->GetGeometryNode()->SetFrameSize(size);
auto parent = hostNode->GetParent();
if (hostNode->IsOnAnimation()) {
return;
}
hostNode->GetRenderContext()->ClipWithRRect(
RectF(0.0f, 0.0f, size.Width(), size.Height()), RadiusF(EdgeF(0.0f, 0.0f)));
OffsetF offset = OffsetF(0.0f, 0.0f);
hostNode->GetRenderContext()->UpdateTranslateInXY(offset);
}
void NavDestinationLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper)

View File

@ -88,7 +88,6 @@ void NavDestinationModelNG::CreateImageButton(const RefPtr<NavDestinationGroupNo
auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty<ImageLayoutProperty>();
CHECK_NULL_VOID(backButtonLayoutProperty);
backButtonLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
backButtonLayoutProperty->UpdateVisibility(VisibleType::GONE);
backButtonNode->MarkModifyDone();
auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
@ -112,7 +111,6 @@ void NavDestinationModelNG::CreateBackButton(const RefPtr<NavDestinationGroupNod
titleBarNode->SetBackButton(backButtonNode);
auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty<ButtonLayoutProperty>();
CHECK_NULL_VOID(backButtonLayoutProperty);
backButtonLayoutProperty->UpdateVisibility(VisibleType::GONE);
backButtonLayoutProperty->UpdateUserDefinedIdealSize(
CalcSize(CalcLength(BACK_BUTTON_SIZE), CalcLength(BACK_BUTTON_SIZE)));
backButtonLayoutProperty->UpdateType(ButtonType::NORMAL);

View File

@ -30,6 +30,8 @@
#include "core/components_ng/pattern/navigation/title_bar_layout_property.h"
#include "core/components_ng/pattern/navigation/title_bar_node.h"
#include "core/components_ng/pattern/navigation/title_bar_pattern.h"
#include "core/components_ng/pattern/navigation/navigation_pattern.h"
#include "core/components_ng/pattern/navigation/navigation_group_node.h"
#include "core/components_ng/pattern/navrouter/navdestination_group_node.h"
#include "core/components_ng/pattern/navrouter/navdestination_layout_algorithm.h"
#include "core/components_ng/pattern/navrouter/navdestination_layout_property.h"
@ -154,4 +156,61 @@ void NavDestinationPattern::OnModifyDone()
}
MountTitleBar(hostNode);
}
bool NavDestinationPattern::GetBackButtonState()
{
auto hostNode = AceType::DynamicCast<NavDestinationGroupNode>(GetHost());
CHECK_NULL_RETURN(hostNode, false);
auto navDestinationLayoutProperty = hostNode->GetLayoutProperty<NavDestinationLayoutProperty>();
CHECK_NULL_RETURN(navDestinationLayoutProperty, false);
if (navDestinationLayoutProperty->GetHideTitleBarValue(false)) {
return false;
}
// get navigation node
auto parent = AceType::DynamicCast<FrameNode>(hostNode->GetParent());
RefPtr<NavigationGroupNode> navigationNode;
while (parent && !parent->IsRootNode()) {
navigationNode = AceType::DynamicCast<NavigationGroupNode>(parent);
if (navigationNode) {
break;
}
parent = AceType::DynamicCast<FrameNode>(parent->GetParent());
}
if (!navigationNode) {
TAG_LOGW(AceLogTag::ACE_NAVIGATION, "can't find navigation node");
return false;
}
auto navigationLayoutProperty = navigationNode->GetLayoutProperty<NavigationLayoutProperty>();
CHECK_NULL_RETURN(navigationLayoutProperty, false);
auto pattern = navigationNode->GetPattern<NavigationPattern>();
auto stack = pattern->GetNavigationStack();
auto index = stack->FindIndex(name_, navDestinationNode_.Upgrade(), true);
bool showBackButton = true;
auto titleBarNode = AceType::DynamicCast<TitleBarNode>(hostNode->GetTitleBarNode());
auto layoutWrapper = AceType::DynamicCast<LayoutAlgorithmWrapper>(navigationNode->GetLayoutAlgorithm());
CHECK_NULL_RETURN(layoutWrapper, showBackButton);
auto layout = AceType::DynamicCast<NavigationLayoutAlgorithm>(layoutWrapper->GetLayoutAlgorithm());
CHECK_NULL_RETURN(layout, false);
if (index == 0 && (layout->GetNavigationMode() == NavigationMode::SPLIT ||
navigationLayoutProperty->GetHideNavBarValue(false))) {
showBackButton = false;
}
auto isCustomTitle = hostNode->GetPrevTitleIsCustomValue(false);
if (isCustomTitle) {
return showBackButton;
}
auto titleNode = AceType::DynamicCast<FrameNode>(titleBarNode->GetTitle());
CHECK_NULL_RETURN(titleNode, showBackButton);
auto theme = NavigationGetTheme();
CHECK_NULL_RETURN(theme, showBackButton);
auto textLayoutProperty = titleNode->GetLayoutProperty<TextLayoutProperty>();
auto currentFontSize = textLayoutProperty->GetAdaptMaxFontSizeValue(Dimension(0.0, DimensionUnit::FP));
auto targetFontSize = showBackButton ? theme->GetTitleFontSizeMin() : theme->GetTitleFontSize();
if (targetFontSize == currentFontSize) {
return showBackButton;
}
textLayoutProperty->UpdateFontSize(targetFontSize);
textLayoutProperty->UpdatePropertyChangeFlag(PROPERTY_UPDATE_MEASURE);
return showBackButton;
}
} // namespace OHOS::Ace::NG

View File

@ -103,6 +103,8 @@ public:
return isOnShow_;
}
bool GetBackButtonState();
private:
RefPtr<ShallowBuilder> shallowBuilder_;
std::string name_;

View File

@ -2444,20 +2444,6 @@ HWTEST_F(NavigationTestNg, NavigationModelNG0014, TestSize.Level1)
ASSERT_NE(backButtonNode2->renderContext_, nullptr);
navigation->BackButtonAnimation(backButtonNode2, false);
navigation->BackButtonAnimation(backButtonNode2, true);
auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
"titleBarNode", 124, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
navDestination->titleBarNode_ = titleBarNode;
auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
auto backButtonNode = FrameNode::CreateFrameNode("backButtonNode22", 125, AceType::MakeRefPtr<ButtonPattern>());
titleBarNode->backButton_ = backButtonNode;
auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty<ButtonLayoutProperty>();
navigation->SetBackButtonVisible(navDestination);
ASSERT_EQ(backButtonLayoutProperty->propVisibility_.value(), VisibleType::VISIBLE);
navigation->SetBackButtonVisible(navDestination, false);
ASSERT_EQ(backButtonLayoutProperty->propVisibility_.value(), VisibleType::GONE);
}
/**