diff --git a/frameworks/core/components_ng/pattern/video/video_full_screen_node.cpp b/frameworks/core/components_ng/pattern/video/video_full_screen_node.cpp index b0145914d691ae31caf6a878155e8c4c7a007960..202dd1fc50a1b6d8df96976a06b72b0a80d804bd 100644 --- a/frameworks/core/components_ng/pattern/video/video_full_screen_node.cpp +++ b/frameworks/core/components_ng/pattern/video/video_full_screen_node.cpp @@ -14,16 +14,25 @@ */ #include "core/components_ng/pattern/video/video_full_screen_node.h" + #include "core/components_ng/pattern/image/image_pattern.h" +#include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h" #include "core/components_ng/pattern/video/video_full_screen_pattern.h" namespace OHOS::Ace::NG { void VideoFullScreenNode::InitVideoFullScreenNode(const RefPtr& video) { + if (video->HasMediaColumnNode()) { + auto mediaColumnId = GetMediaColumnId(); + auto mediaColumNode = FrameNode::GetOrCreateFrameNode( + V2::COLUMN_ETS_TAG, mediaColumnId, []() { return AceType::MakeRefPtr(true); }); + CHECK_NULL_VOID(mediaColumNode); + AddChild(mediaColumNode); + } if (video->HasPreviewImageNode()) { int32_t imageId = ElementRegister::GetInstance()->MakeUniqueId(); - auto previewNode = FrameNode::GetOrCreateFrameNode(V2::IMAGE_ETS_TAG, imageId, - []() { return AceType::MakeRefPtr(); }); + auto previewNode = FrameNode::GetOrCreateFrameNode( + V2::IMAGE_ETS_TAG, imageId, []() { return AceType::MakeRefPtr(); }); CHECK_NULL_VOID(previewNode); AddChild(previewNode); } @@ -36,12 +45,12 @@ void VideoFullScreenNode::InitVideoFullScreenNode(const RefPtr& video } } -RefPtr VideoFullScreenNode::CreateFullScreenNode(const std::string& tag, - int32_t nodeId, const RefPtr& pattern) +RefPtr VideoFullScreenNode::CreateFullScreenNode( + const std::string& tag, int32_t nodeId, const RefPtr& pattern) { auto fullScreenNode = AceType::MakeRefPtr(tag, nodeId, pattern, false); ElementRegister::GetInstance()->AddUINode(fullScreenNode); fullScreenNode->InitializePatternAndContext(); return fullScreenNode; } -} \ No newline at end of file +} // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/frameworks/core/components_ng/pattern/video/video_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/video/video_layout_algorithm.cpp index ee55e29baa05350f3c5a575c27dedbf546b58821..bcfdbff7fba5f5e832ea5d59b394b0af2f723495 100644 --- a/frameworks/core/components_ng/pattern/video/video_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/video/video_layout_algorithm.cpp @@ -15,6 +15,7 @@ #include "core/components_ng/pattern/video/video_layout_algorithm.h" +#include "base/geometry/ng/offset_t.h" #include "base/geometry/ng/size_t.h" #include "base/utils/utils.h" #include "core/components/video/video_theme.h" @@ -45,13 +46,17 @@ VideoLayoutAlgorithm::VideoLayoutAlgorithm() = default; void VideoLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper) { BoxLayoutAlgorithm::PerformLayout(layoutWrapper); + auto contentOffset = layoutWrapper->GetGeometryNode()->GetContentOffset(); for (auto&& child : layoutWrapper->GetAllChildrenWithBuild()) { if (child->GetHostTag() == V2::IMAGE_ETS_TAG) { - child->GetGeometryNode()->SetMarginFrameOffset(OffsetF { 0.0f, 0.0f }); + child->GetGeometryNode()->SetMarginFrameOffset({ contentOffset.GetX(), contentOffset.GetY() }); } else if (child->GetHostTag() == V2::ROW_ETS_TAG) { auto controlBarHeight = CalControlBarHeight(); auto contentSize = layoutWrapper->GetGeometryNode()->GetContentSize(); - child->GetGeometryNode()->SetMarginFrameOffset(OffsetF { 0.0f, contentSize.Height() - controlBarHeight }); + child->GetGeometryNode()->SetMarginFrameOffset( + { contentOffset.GetX(), contentOffset.GetY() + contentSize.Height() - controlBarHeight }); + } else if (child->GetHostTag() == V2::COLUMN_ETS_TAG) { + child->GetGeometryNode()->SetMarginFrameOffset(OffsetF { contentOffset.GetX(), contentOffset.GetY() }); } child->Layout(); } @@ -77,6 +82,12 @@ void VideoLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper) layoutConstraintForControlBar.UpdateMaxSizeWithCheck(controlBarSize); layoutConstraintForControlBar.UpdateMinSizeWithCheck(controlBarSize); child->Measure(layoutConstraintForControlBar); + } else if (child->GetHostTag() == V2::COLUMN_ETS_TAG) { + auto layoutConstraintForImage = layoutConstraint; + layoutConstraintForImage.UpdateSelfMarginSizeWithCheck(OptionalSizeF(contentSize)); + layoutConstraintForImage.UpdateMaxSizeWithCheck(contentSize); + layoutConstraintForImage.UpdateMinSizeWithCheck(contentSize); + child->Measure(layoutConstraintForImage); } } diff --git a/frameworks/core/components_ng/pattern/video/video_model_ng.cpp b/frameworks/core/components_ng/pattern/video/video_model_ng.cpp index 353e0726b91de9f42d68d3b7f247f6c453570457..800bf5485158063e67f9c89d0dd9499028b06a2e 100644 --- a/frameworks/core/components_ng/pattern/video/video_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/video/video_model_ng.cpp @@ -39,7 +39,16 @@ void VideoModelNG::Create(const RefPtr& videoController) stack->Push(videoNode); bool hasPreviewImageNode = videoNode->HasPreviewImageNode(); bool hasControllerRowNode = videoNode->HasControllerRowNode(); - LOGI("Preview image is %{public}d, controller is %{public}d.", hasPreviewImageNode, hasControllerRowNode); + bool hasMediaColumnNode = videoNode->HasMediaColumnNode(); + LOGD("Preview mediaColumn is %{public}d,image is %{public}d, controller is %{public}d.", hasMediaColumnNode, + hasPreviewImageNode, hasControllerRowNode); + if (!hasMediaColumnNode) { + auto mediaColumnId = videoNode->GetMediaColumnId(); + auto mediaColumNode = FrameNode::GetOrCreateFrameNode( + V2::COLUMN_ETS_TAG, mediaColumnId, []() { return AceType::MakeRefPtr(true); }); + CHECK_NULL_VOID(mediaColumNode); + videoNode->AddChild(mediaColumNode); + } if (!hasPreviewImageNode) { auto previewImageId = videoNode->GetPreviewImageId(); auto previewImageNode = FrameNode::GetOrCreateFrameNode( diff --git a/frameworks/core/components_ng/pattern/video/video_node.h b/frameworks/core/components_ng/pattern/video/video_node.h index ef575743247f029e4379b30e34e07d5d8b5cdacd..b7bdfb34bec10cd8433eb1562f669fc13d64f564 100644 --- a/frameworks/core/components_ng/pattern/video/video_node.h +++ b/frameworks/core/components_ng/pattern/video/video_node.h @@ -23,8 +23,9 @@ namespace OHOS::Ace::NG { namespace { -constexpr int32_t PREVIEW_IMAGE_INDEX = 0; -constexpr int32_t CONTROLLER_ROW_INDEX = 1; +constexpr int32_t PREVIEW_IMAGE_INDEX = 1; +constexpr int32_t CONTROLLER_ROW_INDEX = 2; +constexpr int32_t MEDIA_COLUMN_INDEX = 0; } // namespace class ACE_EXPORT VideoNode : public FrameNode { @@ -46,6 +47,11 @@ public: return previewImageId_.has_value(); } + bool HasMediaColumnNode() const + { + return mediaColumnId_.has_value(); + } + int32_t GetControllerRowId() { if (!controllerRowId_.has_value()) { @@ -62,6 +68,14 @@ public: return previewImageId_.value(); } + int32_t GetMediaColumnId() + { + if (!mediaColumnId_.has_value()) { + mediaColumnId_ = ElementRegister::GetInstance()->MakeUniqueId(); + } + return mediaColumnId_.value(); + } + // Get the preview image node, please check null first. RefPtr GetPreviewImage() { @@ -76,11 +90,18 @@ public: return GetChildAtIndex(CONTROLLER_ROW_INDEX); } + RefPtr GetMediaColumn() + { + return GetChildAtIndex(MEDIA_COLUMN_INDEX); + } + static RefPtr GetOrCreateVideoNode( const std::string& tag, int32_t nodeId, const std::function(void)>& patternCreator); + private: std::optional previewImageId_; std::optional controllerRowId_; + std::optional mediaColumnId_; }; } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_VIDEO_VIDEO_NODE_H diff --git a/frameworks/core/components_ng/pattern/video/video_pattern.cpp b/frameworks/core/components_ng/pattern/video/video_pattern.cpp index e9559748ba43cd1e17469bffbc1e54212ba084c2..a9eab3148d59d7bfcf79092061dcf3bd3033a8c5 100644 --- a/frameworks/core/components_ng/pattern/video/video_pattern.cpp +++ b/frameworks/core/components_ng/pattern/video/video_pattern.cpp @@ -405,6 +405,7 @@ void VideoPattern::OnPlayerStatus(PlaybackStatus status) if (status == PlaybackStatus::PREPARED) { auto context = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(context); if (!mediaPlayer_ || !mediaPlayer_->IsMediaPlayerValid()) { return; } @@ -716,7 +717,7 @@ void VideoPattern::OnAttachToFrameNode() } renderContext->UpdateBackgroundColor(Color::BLACK); renderContextForMediaPlayer_->UpdateBackgroundColor(Color::BLACK); - renderContext->SetClipToFrame(true); + renderContext->SetClipToBounds(true); } void VideoPattern::OnModifyDone() @@ -873,8 +874,11 @@ void VideoPattern::OnRebuildFrame() } auto host = GetHost(); CHECK_NULL_VOID(host); - auto renderContext = host->GetRenderContext(); - CHECK_NULL_VOID(renderContext); + auto video = AceType::DynamicCast(host); + CHECK_NULL_VOID(video); + auto column = AceType::DynamicCast(video->GetMediaColumn()); + CHECK_NULL_VOID(column); + auto renderContext = column->GetRenderContext(); renderContext->AddChild(renderContextForMediaPlayer_, 0); } @@ -905,14 +909,12 @@ bool VideoPattern::OnDirtyLayoutWrapperSwap(const RefPtr& dirty, } auto host = GetHost(); CHECK_NULL_RETURN(host, false); - auto renderContext = host->GetRenderContext(); - CHECK_NULL_RETURN(renderContext, false); - auto videoNodeFrameSize = geometryNode->GetFrameSize(); - auto videoNodeFrameOffset = geometryNode->GetFrameOffset(); - RectF rect(videoNodeFrameOffset.GetX(), videoNodeFrameOffset.GetY(), videoNodeFrameSize.Width(), - videoNodeFrameSize.Height()); - renderContext->SetContentRectToFrame(rect); host->MarkNeedSyncRenderTree(); + auto video = AceType::DynamicCast(host); + CHECK_NULL_RETURN(video, false); + auto column = AceType::DynamicCast(video->GetMediaColumn()); + CHECK_NULL_RETURN(column, false); + column->GetRenderContext()->SetClipToBounds(true); return false; }