Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[NUI] Geometry Touch / Gesture Event #6452

Merged
merged 1 commit into from
Nov 13, 2024

Conversation

JoogabYun
Copy link
Contributor

@JoogabYun JoogabYun commented Nov 12, 2024

Description of Change

새로운 geometry touch/gesture event 전파 방식입니다.
SetGeometryHittestEnabled(true)를 하게 되면 새로운 이벤트 전파방식으로 동작합니다.
touch 이벤트는 geometry 기준으로 전파가 되며 gesture는 해당 터치 이벤트를 받아 인식하게 됩니다.
그래서 터치이벤트를 받아 consume하게 되면 더이상 터치 이벤트가 전달되지 않아 하위의 뷰에서 제스처도 인식할 수 없습니다.

참고 페이지
https://confluence.sec.samsung.net/display/GFX/%5B2024+tizen%5D+New+Touch+and+Gesture

hittest를 통해 hit되는 actor를 찾는 과정

  • 기존 방식

    • Scene Tree의 Root에서 시작하여 Child에 대해 hittest를 진행합니다.
    • hit되는 actor에 대해 갱신해 나가면서 최종 마지막으로 hit된 actor를 찾습니다.
    • hit된 actor의 부모로 이벤트가 전파가 됩니다.
    • InterceptTouchEvent도 hit된 actor의 부모에서만 가능합니다.
  • 신규 방식

    • Scene Tree의 Root에서 시작하여 Child에 대해 hittest를 진행합니다.
    • hittest를 진행할 때 parent의 영역을 벗어나는 Child는 더이상 hit되지 못합니다.
    • hit되는 actor들에 대해서 list에 저장합니다.
    • 이렇게 작성된 list의 순서에 의해 InterceptTouchEvent 처리 및 이벤트를 전파합니다.

Touch 이벤트가 전파되는 과정

  • 기존 방식

    • hittest를 통해 얻은 Actor를 기준으로 부모에게 이벤트가 전달됩니다.
      • 매 터치 이벤트가 전달되며 consume여부에 따라 전달 여부가 결정됩니다.
    • InterceptTouch도 Hit된 Actor의 부모들에게서만 가능합니다.
      • InterceptTouchEvent에 의해 consume되면 기존 TouchEvent를 받던 actor들은 INTERRUPTED를 받게 됩니다.
    • 매 터치 이벤트마다 hittest가 발생합니다.
      • LeaveRequired 설정
        • 새로운 터치 이벤트에 의해 hit된 actor가 이전에 이벤트를 발생했던 actor와 다르면 Leave를 보냅니다.
        • 그래서 터치 이벤트로 움직이던 중 actor를 벗어나면 Leave를 받을 수 있습니다.
      • GrabTouchAfterLeave
        • hit된 actor를 벗어나도 계속 hit된 actor에서 터치 이벤트를 받고 싶을 때 사용합니다. 이게 설정되면 LeaveRequired는 무시됩니다.
      • AllowOnlyOwnTouch
        • 처음 hit된 자기 자신의 actor에서만 터치 이벤트를 받고 싶을 때 사용합니다. 다른 actor를 거쳐 넘겨져온 터치 이벤트를 받지 않습니다.
  • 신규 방식

    • hittest를 통해 hit될 수 있는 list를 얻어옵니다.
    • list를 따라가면서 InterceptTouchEvent 처리를 합니다.
      • InterceptTouchEvent가 consume되면 해당 actor부터 TouchEvent가 발생합니다.
    • InterceptTouchEvent에 의해 consume된 게 없었다면 list를 leaf부터 root로 거슬러 올라가면서 TouchEvent처리를 합니다.
      • TouchEvent가 consume되면 consume된 actor가 이후의 터치 이벤트를 모두 받습니다.
        • consume된 actor가 발생하면 이후 interceptTouch는 consume된 actor 직전까지에서만 발생합니다.
      • InterceptTouchEvent에 의해 consume되면 기존 TouchEvent를 받던 actor들은 INTERRUPTED를 받게 됩니다.
    • 다운 이벤트에서만 hittest가 발생합니다.
      • GrabTouchAfterLeave과 AllowOnlyOwnTouch 동작이 기본입니다. 따로 설정은 없습니다.

Hover 이벤트가 전파되는 과정

  • 기존 방식

    • hittest를 통해 얻어온 actor 기준으로 부모에게 이벤트가 전달됩니다.
    • LeaveRequired 설정
      • actor에 진입/진출 했을 때 Start, Leave 이벤트를 보내줍니다.
      • 겹쳐져 있는 actor 위를 호버로 지나갈 때 영역 구분없이 새로운 actor가 나타나면 기존 actor에서는 Leave, 새로운 actor는 Start를 받습니다.
  • 신규 방식

    • hittest를 통해 hit될 수 있는 list를 얻어옵니다.
    • list를 거슬러 올라가면서 이벤트를 전달합니다.
    • actor에 진입/진출 했을 때 Start, Leave 이벤트를 보내줍니다.
    • 겹쳐져 있는 actor 위를 호버로 지나갈 때 새로운 actor를 만나더라도 기존 actor 영역내에 있으면 Leave를 받지 않고 그대로 move이벤트를 받습니다. 새로운 actor는 Start를 받습니다.

Gesture 인식

  • 기존 방식
    • 각 Gesture type별로 hittest를 각각 진행하여 hit된 actor에게 제스처를 인식시켜 이벤트를 발생시켰습니다.
    • Touch와 별개로 독립적으로 동작하며 각 Gesture type과도 별개로 독립적으로 동작하였습니다.
      • Actor가 겹쳐있는 상태에서 Touch에서 Consume하더라도 제스처는 인식됩니다.
      • 겹쳐있는 상태에서 Actor별로 Tap, Pan, LongPress 각각 제스처를 인식 시킬 수 있었습니다.
  • 신규 방식
    • 원하는 GestrueDetector에 HandleEvent하여 hittest없이 actor에게 제스처를 인식시켜 이벤트를 발생시킬 수 있습니다.
    • 아래와 같은 형태처럼 Detector에 HandleEvent하여 제스처를 인식시킵니다.
    • 기존처럼 Attach해서 사용하더라도 내부에선 아래와 같은 방식으로 제스처가 인식됩니다.
           longPressGestureDetector = new LongPressGestureDetector();
           longPressGestureDetector.Detected += (s, e) =>
           {
                   Tizen.Log.Error("NUI", $"{name} longPressGestureDetector");
           }
           orangeView.TouchEvent += (s, e) =>
           {
               longPressGestureDetector.HandleEvent(s as View, e.Touch);
               return true;
           };

API Changes

  • ACR:

@TizenAPI-Bot
Copy link
Collaborator

Internal API Changed

Added: 4, Removed: 0, Changed: 0

Added

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Boolean Tizen.NUI.GestureDetector::HandleEvent(Tizen.NUI.BaseComponents.View,Tizen.NUI.Touch)

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.GestureDetector::CancelAllOtherGestureDetectors()

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static System.Boolean Tizen.NUI.NUIApplication::IsGeometryHittestEnabled()

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static System.Void Tizen.NUI.NUIApplication::SetGeometryHittestEnabled(System.Boolean)

@TizenAPI-Bot
Copy link
Collaborator

Internal API Changed

Added: 4, Removed: 0, Changed: 0

Added

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Boolean Tizen.NUI.GestureDetector::HandleEvent(Tizen.NUI.BaseComponents.View,Tizen.NUI.Touch)

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.GestureDetector::CancelAllOtherGestureDetectors()

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static System.Boolean Tizen.NUI.NUIApplication::IsGeometryHittestEnabled()

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static System.Void Tizen.NUI.NUIApplication::SetGeometryHittestEnabled(System.Boolean)

@JoogabYun JoogabYun changed the title Geometry Touch / Gesture Event [NUI] Geometry Touch / Gesture Event Nov 12, 2024
@JoogabYun JoogabYun marked this pull request as ready for review November 12, 2024 05:01
@TizenAPI-Bot
Copy link
Collaborator

Internal API Changed

Added: 4, Removed: 0, Changed: 0

Added

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Boolean Tizen.NUI.GestureDetector::HandleEvent(Tizen.NUI.BaseComponents.View,Tizen.NUI.Touch)

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.GestureDetector::CancelAllOtherGestureDetectors()

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static System.Boolean Tizen.NUI.NUIApplication::IsGeometryHittestEnabled()

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static System.Void Tizen.NUI.NUIApplication::SetGeometryHittestEnabled(System.Boolean)

Copy link
Contributor

@hinohie hinohie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some review points. But basically, new API only be added.. So Approved

src/Tizen.NUI/src/public/Application/NUIApplication.cs Outdated Show resolved Hide resolved
src/Tizen.NUI/src/public/Events/GestureDetector.cs Outdated Show resolved Hide resolved
src/Tizen.NUI/src/public/Events/GestureDetector.cs Outdated Show resolved Hide resolved
@TizenAPI-Bot
Copy link
Collaborator

Internal API Changed

Added: 4, Removed: 0, Changed: 0

Added

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Boolean Tizen.NUI.GestureDetector::HandleEvent(Tizen.NUI.BaseComponents.View,Tizen.NUI.Touch)

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.GestureDetector::CancelAllOtherGestureDetectors()

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static System.Boolean Tizen.NUI.NUIApplication::IsGeometryHittestEnabled()

+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static System.Void Tizen.NUI.NUIApplication::SetGeometryHittestEnabled(System.Boolean)

Copy link
Contributor

@jaehyun0cho jaehyun0cho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@JoogabYun JoogabYun merged commit 39aae44 into Samsung:DevelNUI Nov 13, 2024
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants