diff --git a/frameworks/core/components_ng/base/frame_node.cpp b/frameworks/core/components_ng/base/frame_node.cpp index a19fa2761ac7674ace28c70eb3d7e4d8405f06ad..26bfea3193c939e9583624a1f9d626b5b3f54162 100644 --- a/frameworks/core/components_ng/base/frame_node.cpp +++ b/frameworks/core/components_ng/base/frame_node.cpp @@ -1461,6 +1461,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) { @@ -1471,6 +1478,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 c6a1533b05625845c2e4dfe0b18f15f5f7604b02..95e80c6b132b8754c35b95574bfd91320a880aee 100644 --- a/frameworks/core/components_ng/event/gesture_event_hub.cpp +++ b/frameworks/core/components_ng/event/gesture_event_hub.cpp @@ -70,6 +70,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_) { @@ -118,6 +121,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 { @@ -138,6 +146,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) { @@ -183,7 +194,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 ae0d47d041cfa7afd873e072627b1d03a85ccd5b..df91e68e9d151443e57ab1afe416eba0f9e7accb 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 010f92e6027e5fbd2a3f4d181399d277a8487afb..dbe8118ffa14b31cfdfb09b433ca4bf7e39b623a 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 2e5157c04be5461f8d61ea5cc6b37dccd25877aa..0eeb9070ecdf93699f4ceff64e2b0d690bdbcfef 100644 --- a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp @@ -207,7 +207,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 5985dcb175366b1577a81f319c27347d1a3083af..65393ae31994d2cb2c7f709ada18c51446732e0c 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 @@ -284,9 +284,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 3bd8d30b7612a2108db52ea3d6ceb7ff6df07cb1..41dfa43563d298221b57a9e2caf3fdfe94d1a0e8 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 @@ -74,7 +74,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 94c507f49659f8328d65df52abdf217ce67d43bc..8cf44db00fb129fa900522722b897027d18772dc 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 71e842882dd327735b5ef636d6bee796b32ff7b2..2bb4945b82369a84fb4ba889e5bef575f6f660df 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 409b91fe547593ece81ae3ee34b9a4701b1cd0f7..0e427b89ac823f811a23ba6040e66903ab749d2f 100644 --- a/frameworks/core/components_ng/render/render_context.h +++ b/frameworks/core/components_ng/render/render_context.h @@ -450,6 +450,10 @@ public: ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(RenderFit, RenderFit); virtual void SetUsingContentRectForRenderFrame(bool value) {} + virtual std::vector GetTrans() + { + return std::vector(); + } virtual void SetFrameGravity(OHOS::Rosen::Gravity gravity) {} protected: 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 58b64f31e95d1abbfa55feb52f9ff6f1ae6e3147..2e1b7d324f7c5611b54c6584fe183301ad59c9b1 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 b1899b00598194937df1479aae12c8269aa66add..7f9cad7c10fa3f3f15588be864011bf79eb072bc 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,