From e5bd8fcb4b4a98cf77efd9a6ff818bc6d0994dee Mon Sep 17 00:00:00 2001 From: zhaojian2021 Date: Mon, 31 Jul 2023 05:08:00 +0000 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=97=8B=E8=BD=AC=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhaojian2021 --- .../core/components_ng/base/frame_node.cpp | 28 ++++++ .../components_ng/event/gesture_event_hub.cpp | 14 +++ .../gestures/recognizers/gesture_recognizer.h | 2 + .../gestures/recognizers/pan_recognizer.cpp | 8 +- .../render/adapter/rosen_render_context.cpp | 91 ++++++++++++++----- .../render/adapter/rosen_render_context.h | 2 + .../components_ng/render/render_context.h | 5 +- frameworks/core/gestures/gesture_info.h | 20 ++++ .../core/gestures/gesture_recognizer.cpp | 44 +++++++++ 9 files changed, 190 insertions(+), 24 deletions(-) diff --git a/frameworks/core/components_ng/base/frame_node.cpp b/frameworks/core/components_ng/base/frame_node.cpp index 78f3e793434..5d61279c029 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 "gestureStack" +#define SECBOARDSPECIALSCROLLNODE "scrollTest1" +#define SECBOARDSPECIALPANODE "parent" + HitTestResult FrameNode::TouchTest(const PointF& globalPoint, const PointF& parentLocalPoint, const TouchRestrict& touchRestrict, TouchTestResult& result, int32_t touchId) { @@ -1470,6 +1477,27 @@ HitTestResult FrameNode::TouchTest(const PointF& globalPoint, const PointF& pare return HitTestResult::OUT_OF_REGION; } auto paintRect = renderContext_->GetPaintRectWithTransform(); + auto name = GetInspectorId().value_of(""); + 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..41708f6be61 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.h b/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.h index 010f92e6027..1a88280c661 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 { @@ -241,6 +242,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/render/adapter/rosen_render_context.cpp b/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp index f6aa0efa4dc..a0b3a31a2fb 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,25 +866,36 @@ 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)trans.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; + auto tmp2 = ly; + 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; } @@ -892,8 +915,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 = 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 e5bb2960a3b..e4e95043ab8 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 75696375737..566077dec0d 100644 --- a/frameworks/core/components_ng/render/render_context.h +++ b/frameworks/core/components_ng/render/render_context.h @@ -447,7 +447,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/gestures/gesture_info.h b/frameworks/core/gestures/gesture_info.h index f1d2da84a8b..c5ee2dbf9c3 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, diff --git a/frameworks/core/gestures/gesture_recognizer.cpp b/frameworks/core/gestures/gesture_recognizer.cpp index 821a5f56a4b..6bba67d1070 100644 --- a/frameworks/core/gestures/gesture_recognizer.cpp +++ b/frameworks/core/gestures/gesture_recognizer.cpp @@ -133,4 +133,48 @@ void GestureRecognizer::BatchAdjudicate( referee->Adjudicate(pointerId, 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 (int 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.GeY() - 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 -- Gitee