From ebe99933746e525bf91b1aee7d7bc8ad1925d0c2 Mon Sep 17 00:00:00 2001 From: zhangkai Date: Mon, 31 Jul 2023 07:25:31 +0000 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E8=BD=BB=E9=87=8F=E7=BA=A7=20PR?= =?UTF-8?q?=E3=80=91=EF=BC=9A=E6=96=B0=E6=97=8B=E8=BD=AC=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangkai Change-Id: Ib16c5aac296119176bb68f06afc04a94710776f0 --- .../core/components_ng/base/frame_node.cpp | 29 ++++++ .../components_ng/event/gesture_event_hub.cpp | 14 +++ .../recognizers/gesture_recognizer.cpp | 43 +++++++++ .../gestures/recognizers/gesture_recognizer.h | 6 +- .../gestures/recognizers/pan_recognizer.cpp | 8 +- .../window_scene/scene/window_pattern.cpp | 40 ++++++++ .../window_scene/scene/window_pattern.h | 3 +- .../render/adapter/rosen_render_context.cpp | 95 ++++++++++++++----- .../render/adapter/rosen_render_context.h | 2 + .../components_ng/render/render_context.h | 5 +- .../recognizers/mock_gesture_recognizer.cpp | 4 + frameworks/core/gestures/gesture_info.h | 20 ++++ 12 files changed, 243 insertions(+), 26 deletions(-) diff --git a/frameworks/core/components_ng/base/frame_node.cpp b/frameworks/core/components_ng/base/frame_node.cpp index 78f3e793434..c96d98ac96e 100644 --- a/frameworks/core/components_ng/base/frame_node.cpp +++ b/frameworks/core/components_ng/base/frame_node.cpp @@ -1460,6 +1460,13 @@ bool FrameNode::IsOutOfTouchTestRegion(const PointF& parentLocalPoint, int32_t s return false; } +std::unordered_map g_transform; +std::unordered_map> g_vid; +int upid = -1; +#define SECBOARDSPECIALSTACKNODE "SCBGestureStack:gestureStack" +#define SECBOARDSPECIALSCROLLNODE "SCBScroll:scrollTest1" +#define SECBOARDSPECIALPANODE "SCBScenePanel:parent" + HitTestResult FrameNode::TouchTest(const PointF& globalPoint, const PointF& parentLocalPoint, const TouchRestrict& touchRestrict, TouchTestResult& result, int32_t touchId) { @@ -1470,6 +1477,28 @@ HitTestResult FrameNode::TouchTest(const PointF& globalPoint, const PointF& pare return HitTestResult::OUT_OF_REGION; } auto paintRect = renderContext_->GetPaintRectWithTransform(); + auto name = GetInspectorId().value_or(""); + auto param = renderContext_->GetTrans(); + TransformConfig cfg = { param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7], param[8], + GetId() }; + auto parent = GetParent(); + auto itr = g_transform.find(GetId()); + if (itr != g_transform.end()) { + if (!(cfg == itr->second)) { + itr->second = cfg; + } + } else { + if (parent) { + g_vid[GetId()] = g_vid[parent->GetId()]; + } + if (name == SECBOARDSPECIALSTACKNODE || name == SECBOARDSPECIALSCROLLNODE) { + g_vid[GetId()] = g_vid[upid]; + } else if (name == SECBOARDSPECIALPANODE) { + upid = GetId(); + } + g_transform[GetId()] = cfg; + g_vid[GetId()].push_back(GetId()); + } auto responseRegionList = GetResponseRegionList(paintRect, static_cast(touchRestrict.sourceType)); if (SystemProperties::GetDebugEnabled()) { LOGI("TouchTest: point is %{public}s in %{public}s, depth: %{public}d", parentLocalPoint.ToString().c_str(), diff --git a/frameworks/core/components_ng/event/gesture_event_hub.cpp b/frameworks/core/components_ng/event/gesture_event_hub.cpp index b9a29faf153..85cf43acb7e 100644 --- a/frameworks/core/components_ng/event/gesture_event_hub.cpp +++ b/frameworks/core/components_ng/event/gesture_event_hub.cpp @@ -66,6 +66,9 @@ RefPtr GestureEventHub::GetFrameNode() const bool GestureEventHub::ProcessTouchTestHit(const OffsetF& coordinateOffset, const TouchRestrict& touchRestrict, TouchTestResult& innerTargets, TouchTestResult& finalResult, int32_t touchId, const PointF& localPoint) { + size_t idx = innerTargets.size(); + size_t newidx = 0; + auto host = GetFrameNode(); auto eventHub = eventHub_.Upgrade(); auto getEventTargetImpl = eventHub ? eventHub->CreateGetEventTargetImpl() : nullptr; if (scrollableActuator_) { @@ -114,6 +117,11 @@ bool GestureEventHub::ProcessTouchTestHit(const OffsetF& coordinateOffset, const for (auto const& eventTarget : innerTargets) { auto recognizer = AceType::DynamicCast(eventTarget); if (recognizer) { + auto recognizerGroup = AceType::DynamicCast(recognizer); + if (!recognizerGroup && newidx >= idx) { + recognizer->SetTransInfo(host->GetId()); + } + newidx++; // 检查子手势是否都查询到 recognizer->BeginReferee(touchId); innerRecognizers.push_back(std::move(recognizer)); } else { @@ -134,6 +142,9 @@ void GestureEventHub::OnModifyDone() } } +extern std::unordered_map g_transform; +extern std::unordered_map> g_vid; + void GestureEventHub::ProcessTouchTestHierarchy(const OffsetF& coordinateOffset, const TouchRestrict& touchRestrict, std::list>& innerRecognizers, TouchTestResult& finalResult, int32_t touchId) { @@ -179,7 +190,10 @@ void GestureEventHub::ProcessTouchTestHierarchy(const OffsetF& coordinateOffset, if (groupRecognizer) { groupRecognizer->SetCoordinateOffset(offset); } + groupRecognizer->SetTransInfo(host->GetId()); } + } else { + recognizer->SetTransInfo(host->GetId()); } recognizer->SetSize(size.Height(), size.Width()); recognizer->SetCoordinateOffset(offset); diff --git a/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.cpp index ae0d47d041c..df91e68e9d1 100644 --- a/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.cpp @@ -102,4 +102,47 @@ void NGGestureRecognizer::BatchAdjudicate(const RefPtr& rec } referee->Adjudicate(recognizer, disposal); } + +extern std::unordered_map g_transform; +extern std::unordered_map> g_vid; + +void NGGestureRecognizer::Transform(PointF& winpf, PointF& arkpf) +{ + const float pi = 3.14159265; + double offsetx = 0; + double offsety = 0; + auto itr = g_vid.find(id); + if (itr == g_vid.end()) + return; + auto& vtrans = itr->second; + for (uint32_t i = 0; i < vtrans.size(); i++) { + auto& trans = g_transform[vtrans[i]]; + offsetx += trans.offsetx; + offsety += trans.offsety; + int degree = (int)trans.degree % 360; + if (degree < 0) + degree += 360; + auto radian = degree / 180.0; + radian *= pi; + + if (trans.degree == 0) { + arkpf.SetX(arkpf.GetX() - trans.offsetx); + arkpf.SetY(arkpf.GetY() - trans.offsety); + } else { + auto x = (arkpf.GetX() - trans.centerx) * cos(radian) + (arkpf.GetY() - trans.centery) * sin(radian); + auto y = -1 * (arkpf.GetX() - trans.centerx) * sin(radian) + (arkpf.GetY() - trans.centery) * cos(radian); + x += trans.centerx; + y += trans.centery; + arkpf.SetX(x - trans.offsetx); + arkpf.SetY(y - trans.offsety); + } + } + winpf.SetX(arkpf.GetX() + offsetx); + winpf.SetY(arkpf.GetY() + offsety); +} + +void NGGestureRecognizer::SetTransInfo(int id) +{ + this->id = id; +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.h b/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.h index 010f92e6027..dbe8118ffa1 100644 --- a/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.h +++ b/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.h @@ -23,6 +23,7 @@ #include "core/components_ng/gestures/gesture_referee.h" #include "core/event/axis_event.h" #include "core/event/touch_event.h" +#include "frameworks/base/geometry/ng/point_t.h" namespace OHOS::Ace::NG { @@ -198,7 +199,9 @@ public: recognizerTarget.area.SetWidth(Dimension(recognizerTargetAreaWidth.value())); recognizerTarget_ = recognizerTarget; } - + + void SetTransInfo(int id); + void Transform(PointF& winpf, PointF& arkpf); protected: void Adjudicate(const RefPtr& recognizer, GestureDisposal disposal) { @@ -241,6 +244,7 @@ protected: SourceType deviceType_ = SourceType::NONE; // size of recognizer target. std::optional recognizerTarget_ = std::nullopt; + int id; private: WeakPtr gestureGroup_; diff --git a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp index 57a8639542a..449856f42b7 100644 --- a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp @@ -208,7 +208,13 @@ void PanRecognizer::HandleTouchMoveEvent(const TouchEvent& event) LOGD("pan recognizer receives touch move event"); globalPoint_ = Point(event.x, event.y); lastTouchEvent_ = event; - delta_ = (event.GetOffset() - touchPoints_[event.id].GetOffset()) / touchPoints_.size(); + PointF curepoint(event.GetOffset().GetX(), event.GetOffset().GetY()); + PointF prevp(touchPoints_[event.id].GetOffset().GetX(), touchPoints_[event.id].GetOffset().GetY()); + PointF wincur = curepoint; + PointF winprev = prevp; + Transform(wincur, curepoint); + Transform(winprev, prevp); + delta_ = (Offset(wincur.GetX(), wincur.GetY()) - Offset(winprev.GetX(), winprev.GetY())); mainDelta_ = GetMainAxisDelta(); velocityTracker_.UpdateTouchPoint(event); averageDistance_ += delta_; diff --git a/frameworks/core/components_ng/pattern/window_scene/scene/window_pattern.cpp b/frameworks/core/components_ng/pattern/window_scene/scene/window_pattern.cpp index 1d46358ca25..c2d5ae8cb44 100644 --- a/frameworks/core/components_ng/pattern/window_scene/scene/window_pattern.cpp +++ b/frameworks/core/components_ng/pattern/window_scene/scene/window_pattern.cpp @@ -376,9 +376,49 @@ void WindowPattern::HandleTouchEvent(const TouchEventInfo& info) auto selfGlobalOffset = host->GetTransformRelativeOffset(); auto scale = host->GetTransformScale(); Platform::CalculateWindowCoordinate(selfGlobalOffset, pointerEvent, scale); + AdapterRotation(pointerEvent); DispatchPointerEvent(pointerEvent); } +extern std::unordered_map g_transform; +extern int upid; +void WindowPattern::AdapterRotation(const std::shared_ptr& pointerEvent) +{ + CHECK_NULL_VOID(pointerEvent); + auto udegree = upid != -1 ? g_transform[upid].degree : -1; + if (udegree == -1 || udegree == 0) { + return; + } + int32_t pointerId = pointerEvent->GetPointerId(); + MMI::PointerEvent::PointerItem item; + bool ret = pointerEvent->GetPointerItem(pointerId, item); + if (!ret) { + return; + } + int32_t originWindowX = item.GetWindowX(); + int32_t originWindowY = item.GetWindowY(); + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto rect = host->GetPaintRectWithTransform(); + int32_t width = static_cast(rect.Width()); + int32_t height = static_cast(rect.Height()); + if (udegree == 90 || udegree == -270) { + item.SetWindowX(originWindowY); + item.SetWindowY(height - originWindowX); + } + if (udegree == 180 || udegree == -180) { + item.SetWindowX(width - originWindowX); + item.SetWindowY(height - originWindowY); + } + if (udegree == 270 || udegree == -90) { + item.SetWindowX(width - originWindowY); + item.SetWindowY(originWindowX); + } + pointerEvent->UpdatePointerItem(pointerId, item); + LOGI("WindowPattern AdapterRotation udegree:%{public}f, windowX:%{public}d, windowY:%{public}d", udegree, + item.GetWindowX(), item.GetWindowY()); +} + bool WindowPattern::IsFilterTouchEvent(const std::shared_ptr& pointerEvent) { return (pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_MOUSE && diff --git a/frameworks/core/components_ng/pattern/window_scene/scene/window_pattern.h b/frameworks/core/components_ng/pattern/window_scene/scene/window_pattern.h index 0638c482b42..21db1b14212 100644 --- a/frameworks/core/components_ng/pattern/window_scene/scene/window_pattern.h +++ b/frameworks/core/components_ng/pattern/window_scene/scene/window_pattern.h @@ -75,7 +75,8 @@ private: void HandleTouchEvent(const TouchEventInfo& info); bool IsFilterTouchEvent(const std::shared_ptr& pointerEvent); bool IsFilterMouseEvent(const std::shared_ptr& pointerEvent); - + void AdapterRotation(const std::shared_ptr& pointerEvent); + std::shared_ptr lifecycleListener_; RefPtr touchEvent_; RefPtr mouseEvent_; diff --git a/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp b/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp index 3dc9d696c72..682a0e1a21d 100644 --- a/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp +++ b/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp @@ -829,10 +829,21 @@ void RosenRenderContext::OnTransformMatrixUpdate(const Matrix4& matrix) RequestNextFrame(); } -const int degree90 = 90; -const int degree180 = 180; -const int degree135 = 135; -const int degree45 = 45; +RectF grect; + +void SetCorner(double& x, double& y, double width, double height, double degree) +{ + if (degree == 90) { + x = 0; + y = height; + } else if (degree == 180) { + x = width; + y = height; + } else if (degree == 270) { + x = width; + y = 0; + } +} RectF RosenRenderContext::GetPaintRectWithTransform() { @@ -844,6 +855,7 @@ RectF RosenRenderContext::GetPaintRectWithTransform() auto translate = rsNode_->GetStagingProperties().GetTranslate(); auto scale = rsNode_->GetStagingProperties().GetScale(); auto center = rsNode_->GetStagingProperties().GetPivot(); + int degree = rsNode_->GetStagingProperties().GetRotation(); // calculate new pos. auto centOffset = OffsetF(center[0] * rect.Width(), center[1] * rect.Height()); auto centerPos = rect.GetOffset() + centOffset; @@ -854,28 +866,43 @@ RectF RosenRenderContext::GetPaintRectWithTransform() auto oldSize = rect.GetSize(); auto newSize = SizeF(oldSize.Width() * scale[0], oldSize.Height() * scale[1]); rect.SetSize(newSize); + transinfo = { scale[0], scale[1], centerPos.GetX(), centerPos.GetY(), rect.GetX(), rect.GetY(), translate[0], + translate[1], degree }; // calculate rotate - int degree = rsNode_->GetStagingProperties().GetRotation(); - - if ((abs(degree) % degree180 > degree45) && (abs(degree) % degree180 < degree135)) { - degree = degree90; - OffsetF leftCornerRotate(0, 0); - OffsetF leftCorner(-1 * oldSize.Width() * scale[0] / 2, -1 * oldSize.Height() * scale[1] / 2); - leftCornerRotate.SetX(leftCorner.GetX() * cos(degree * pi / degree180) * -1 - - leftCorner.GetY() * sin(degree * pi / degree180) * -1); - leftCornerRotate.SetY(leftCorner.GetX() * sin(degree * pi / degree180) * -1 + - leftCorner.GetY() * cos(degree * pi / degree180) * -1); - OffsetF screenRotate(rect.GetX() + leftCornerRotate.GetX() - leftCorner.GetX(), - rect.GetY() + oldSize.Height() * scale[1] - leftCornerRotate.GetY() + leftCorner.GetY()); - rect.SetOffset(screenRotate); - if (abs(degree) % degree180 != 0) { - newSize = SizeF(oldSize.Height() * scale[1], oldSize.Width() * scale[0]); - rect.SetSize(newSize); - } - } + degree = (int)degree % 360; + if (degree < 0) + degree += 360; + auto radian = degree / 180.0; + radian *= pi; + + if (degree !=0 ) { + auto rectnew = GetPaintRectWithoutTransform(); + double lx = 0; + double ly = oldSize.Height(); + SetCorner(lx, ly, oldSize.Width(), oldSize.Height(), degree); + double centx = oldSize.Width() / 2; + double centy = oldSize.Height() / 2; + auto tmp = lx; + lx = (lx - centx) * cos(-1 * radian) + (ly - centy) * sin(-1 * radian); + ly = -1 * (tmp - centx) * sin(-1 * radian) + (ly - centy) * cos(-1 * radian); + auto lxcalc1 = lx + centx; + auto lycalc1 = ly + centy; + lx = rectnew.GetOffset().GetX() + lxcalc1; + ly = rectnew.GetOffset().GetY() + lycalc1; + auto offset = OffsetF(lx, ly); + rect.SetOffset(offset); + newSize = SizeF(oldSize.Height() * scale[1], oldSize.Width() * scale[0]); + rect.SetSize(newSize); + } + grect = rect; return rect; } +std::vector RosenRenderContext::GetTrans() +{ + return transinfo; +} + RectF RosenRenderContext::GetPaintRectWithTranslate() { RectF rect; @@ -892,8 +919,32 @@ void RosenRenderContext::GetPointWithTransform(PointF& point) auto translate = rsNode_->GetStagingProperties().GetTranslate(); auto scale = rsNode_->GetStagingProperties().GetScale(); point = PointF(point.GetX() / scale[0], point.GetY() / scale[1]); + const float pi = 3.14159265; + RectF rect = GetPaintRectWithoutTransform(); + auto center = rsNode_->GetStagingProperties().GetPivot(); + int degree = rsNode_->GetStagingProperties().GetRotation(); + degree = degree % 360; + if (degree < 0) + degree += 360; + auto radian = degree / 180.0; + radian *= pi; + if (degree != 0) { + point = point + grect.GetOffset(); + auto centOffset = OffsetF(center[0] * rect.Width(), center[1] * rect.Height()); + auto centerPos = rect.GetOffset() + centOffset; + auto centx = centerPos.GetX(); + auto centy = centerPos.GetY(); + + double x = (point.GetX() - centx) * cos(radian) + (point.GetY() - centy) * sin(radian); + double y = -1 * (point.GetX() - centx) * sin(radian) + (point.GetY() - centy) * cos(radian); + x = x + centx; + y = y + centy; + point.SetX(x - rect.Left()); + point.SetY(y - rect.Top()); + } } + RectF RosenRenderContext::GetPaintRectWithoutTransform() { RectF rect; diff --git a/frameworks/core/components_ng/render/adapter/rosen_render_context.h b/frameworks/core/components_ng/render/adapter/rosen_render_context.h index 7acb4ee6d91..7bc0183ff3f 100644 --- a/frameworks/core/components_ng/render/adapter/rosen_render_context.h +++ b/frameworks/core/components_ng/render/adapter/rosen_render_context.h @@ -239,6 +239,8 @@ public: void MarkDrivenRenderItemIndex(int32_t index) override; void MarkDrivenRenderFramePaintState(bool flag) override; RefPtr GetThumbnailPixelMap() override; + std::vector transinfo; + std::vector GetTrans() override; #ifndef USE_ROSEN_DRAWING bool GetBitmap(SkBitmap& bitmap, std::shared_ptr drawCmdList = nullptr); #else diff --git a/frameworks/core/components_ng/render/render_context.h b/frameworks/core/components_ng/render/render_context.h index ab0e06800d2..67b5bb188ef 100644 --- a/frameworks/core/components_ng/render/render_context.h +++ b/frameworks/core/components_ng/render/render_context.h @@ -445,7 +445,10 @@ public: ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(RenderFit, RenderFit); virtual void SetUsingContentRectForRenderFrame(bool value) {} - + virtual std::vector GetTrans() + { + return std::vector(); + } protected: RenderContext() = default; std::shared_ptr sharedTransitionOption_; diff --git a/frameworks/core/components_ng/test/mock/gesture/recognizers/mock_gesture_recognizer.cpp b/frameworks/core/components_ng/test/mock/gesture/recognizers/mock_gesture_recognizer.cpp index 58b64f31e95..2e1b7d324f7 100644 --- a/frameworks/core/components_ng/test/mock/gesture/recognizers/mock_gesture_recognizer.cpp +++ b/frameworks/core/components_ng/test/mock/gesture/recognizers/mock_gesture_recognizer.cpp @@ -27,4 +27,8 @@ bool NGGestureRecognizer::HandleEvent(const AxisEvent& /* event */) } void NGGestureRecognizer::BatchAdjudicate(const RefPtr& recognizer, GestureDisposal disposal) {} + +void NGGestureRecognizer::Transform(PointF& winpf, PointF& arkpf) {} + +void NGGestureRecognizer::SetTransInfo(int id) {} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/gestures/gesture_info.h b/frameworks/core/gestures/gesture_info.h index b938979bb05..32e9df54c99 100644 --- a/frameworks/core/gestures/gesture_info.h +++ b/frameworks/core/gestures/gesture_info.h @@ -52,6 +52,26 @@ constexpr int32_t DEFAULT_LONG_PRESS_DURATION = 100; class GestureRecognizer; class PipelineBase; +struct TransformConfig { + int scalex = 1; + int scaley = 1; + double centerx = 0; + double centery = 0; + double offsetx = 0; + double offsety = 0; + double translatex = 0; + double translatey = 0; + double degree = 0; + // std::string tag; + int id = -1; + bool operator==(TransformConfig tc) + { + return scalex = tc.scalex && scaley == tc.scaley && centerx == tc.centerx && offsetx == tc.offsetx && + offsety == tc.offsety && translatex == tc.translatex && translatey == tc.translatey && + degree == tc.degree; + } +}; + enum class GesturePriority { Begin = -1, Low = 0, -- Gitee