KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UPageScrollView 클래스 참조

페이지 단위 스크롤 뷰 위젯 드래그 기반 스크롤과 자동 스냅 기능을 제공하는 메인 컨트롤러 위젯입니다. 더 자세히 ...

#include <UPageScrollView.h>

+ UPageScrollView에 대한 상속 다이어그램 :
+ UPageScrollView에 대한 협력 다이어그램:

Public 멤버 함수

int32 GetCurrentPage () const
 현재 페이지 인덱스를 반환합니다.
 
UPageScrollItemGetPageAt (int32 Index) const
 특정 인덱스의 페이지 아이템을 반환합니다.
 
int32 GetTotalPages () const
 총 페이지 수를 반환합니다.
 
void MovePage (int32 PageIndex, bool bAnimate=true)
 특정 페이지로 이동합니다.
 
void NextPage ()
 다음 페이지로 이동합니다.
 
void PrevPage ()
 이전 페이지로 이동합니다.
 
void SetNumberOfPages (int32 ItemCount)
 페이지 개수를 설정하고 동적으로 생성합니다.
 

Public 속성

bool bEnableScaleEffect = false
 중앙 스케일 효과 활성화 여부
 
int32 DefaultPageIndex = 0
 기본으로 선택될 페이지 인덱스
 
float FastSwipeThreshold = 500.0f
 빠른 스와이프 인식 임계값 (픽셀/초)
 
float FocusScale = 1.0f
 중앙에 있는 페이지의 스케일 값
 
FOnPageChanged OnPageChanged
 페이지 변경 이벤트
 
TObjectPtr< class UCanvasPanel > PageContainer
 페이지 아이템들을 담을 컨테이너 (드래그로 위치 이동)
 
TObjectPtr< class UPageScrollDotPageDotIndicator
 페이지 인디케이터 (선택적)
 
TSubclassOf< class UPageScrollItemPageItemClass
 페이지 아이템으로 생성할 위젯 블루프린트 클래스
 
FVector2D PageSize = FVector2D(1920.0f, 1080.0f)
 각 페이지의 크기 (Width × Height)
 
float PageSpacing = 0.0f
 페이지 간 간격 (픽셀)
 
EPageScrollDirection ScrollDirection = EPageScrollDirection::Horizontal
 스크롤 방향 (수평/수직)
 
float SideScale = 0.8f
 중앙에서 벗어난 페이지의 스케일 값
 
float SnapAnimationSpeed = 0.3f
 스냅 애니메이션 속도 (초 단위)
 

Protected 멤버 함수

virtual void NativeConstruct () override
 
virtual void NativeDestruct () override
 
virtual FReply NativeOnMouseButtonDown (const FGeometry &InGeometry, const FPointerEvent &InMouseEvent) override
 마우스 버튼 다운 이벤트
 
virtual FReply NativeOnMouseButtonUp (const FGeometry &InGeometry, const FPointerEvent &InMouseEvent) override
 마우스 버튼 업 이벤트
 
virtual FReply NativeOnMouseMove (const FGeometry &InGeometry, const FPointerEvent &InMouseEvent) override
 마우스 이동 이벤트
 

Private 멤버 함수

int32 CalculateTargetPage (FVector2D DragDelta, float Velocity) const
 드래그 종료 시 목표 페이지를 계산합니다.
 
FVector2D GetPagePosition (int32 PageIndex) const
 페이지 인덱스에 해당하는 목표 위치를 계산합니다.
 
FORCEINLINE float GetPageStride () const
 페이지 간 거리를 계산합니다.
 
void SetContainerPosition (FVector2D Position)
 컨테이너 위치를 설정합니다.
 
void StopAnimation ()
 스냅 애니메이션을 중지합니다.
 
void TickSnapAnimation ()
 스냅 애니메이션을 Tick합니다.
 
void UpdateContainerPositionDuringDrag ()
 드래그 중 컨테이너 위치를 업데이트합니다.
 
void UpdateItemScales ()
 페이지 아이템들의 스케일을 거리 기반으로 업데이트합니다.
 
void UpdatePageDotIndicator ()
 페이지 인디케이터를 업데이트합니다.
 

Private 속성

float animElapsedTime = 0.0f
 
FVector2D animStartPosition = FVector2D::ZeroVector
 
FVector2D animTargetPosition = FVector2D::ZeroVector
 
bool bIsAnimating = false
 
bool bIsDragging = false
 드래그 상태 추적
 
int32 CurPageIndex = 0
 현재 선택된 페이지 인덱스
 
FVector2D dragCurrentPosition = FVector2D::ZeroVector
 
FVector2D dragStartPosition = FVector2D::ZeroVector
 
float dragStartTime = 0.0f
 
TArray< TObjectPtr< class UPageScrollItem > > pageItemList
 생성된 페이지 아이템 목록
 
int32 PrevPageIndex = 0
 이전 페이지 인덱스 (스냅 계산용)
 
FTimerHandle snapAnimTimerHandle
 애니메이션 상태
 
FVector2D ViewportSize = FVector2D::ZeroVector
 뷰포트 크기 (SizeBox에서 계산)
 

상세한 설명

페이지 단위 스크롤 뷰 위젯 드래그 기반 스크롤과 자동 스냅 기능을 제공하는 메인 컨트롤러 위젯입니다.

UPageScrollView.h 파일의 18 번째 라인에서 정의되었습니다.

멤버 함수 문서화

◆ CalculateTargetPage()

int32 UPageScrollView::CalculateTargetPage ( FVector2D  DragDelta,
float  Velocity 
) const
private

드래그 종료 시 목표 페이지를 계산합니다.

매개변수
[in]DragDelta드래그 이동 거리
[in]Velocity드래그 속도 (픽셀/초)
반환값
목표 페이지 인덱스

UPageScrollView.cpp 파일의 236 번째 라인에서 정의되었습니다.

237{
238 float delta = (ScrollDirection == EPageScrollDirection::Horizontal)
239 ? DragDelta.X
240 : DragDelta.Y;
241
242 int32 targetPage = CurPageIndex;
243
244 // 빠른 스와이프 감지
245 if (Velocity >= FastSwipeThreshold)
246 {
247 // 양수: 오른쪽/아래로 드래그 → 이전 페이지
248 // 음수: 왼쪽/위로 드래그 → 다음 페이지
249 targetPage = (delta > 0) ? CurPageIndex - 1 : CurPageIndex + 1;
250 }
251 else
252 {
253 // 느린 드래그: 가장 가까운 페이지로 스냅
254 float dragRatio = delta / GetPageStride();
255 int32 dragPages = FMath::RoundToInt(dragRatio);
256 targetPage = CurPageIndex - dragPages; // 음수 방향 (Unity와 동일)
257 }
258
259 // 범위 제한
260 return FMath::Clamp(targetPage, 0, pageItemList.Num() - 1);
261}
int32 CurPageIndex
현재 선택된 페이지 인덱스
FORCEINLINE float GetPageStride() const
페이지 간 거리를 계산합니다.
EPageScrollDirection ScrollDirection
스크롤 방향 (수평/수직)
float FastSwipeThreshold
빠른 스와이프 인식 임계값 (픽셀/초)
TArray< TObjectPtr< class UPageScrollItem > > pageItemList
생성된 페이지 아이템 목록

다음을 참조함 : CurPageIndex, FastSwipeThreshold, GetPageStride(), pageItemList, ScrollDirection.

다음에 의해서 참조됨 : NativeOnMouseButtonUp().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetCurrentPage()

int32 UPageScrollView::GetCurrentPage ( ) const
inline

현재 페이지 인덱스를 반환합니다.

반환값
현재 페이지 인덱스

UPageScrollView.h 파일의 58 번째 라인에서 정의되었습니다.

58{ return CurPageIndex; }

◆ GetPageAt()

UPageScrollItem * UPageScrollView::GetPageAt ( int32  Index) const
inline

특정 인덱스의 페이지 아이템을 반환합니다.

매개변수
[in]Index페이지 인덱스
반환값
페이지 아이템 (없으면 nullptr)

UPageScrollView.h 파일의 69 번째 라인에서 정의되었습니다.

70 {
71 return pageItemList.IsValidIndex(Index) ? pageItemList[Index] : nullptr;
72 }

◆ GetPagePosition()

FVector2D UPageScrollView::GetPagePosition ( int32  PageIndex) const
private

페이지 인덱스에 해당하는 목표 위치를 계산합니다.

매개변수
[in]PageIndex페이지 인덱스
반환값
목표 위치 (2D Vector)

UPageScrollView.cpp 파일의 316 번째 라인에서 정의되었습니다.

317{
318 float stride = GetPageStride();
319 float offset = -stride * PageIndex; // 음수: 컨테이너를 왼쪽/위로 이동
320
321 return ScrollDirection == EPageScrollDirection::Horizontal ? FVector2D(offset, 0.0f) : FVector2D(0.0f, offset);
322}

다음을 참조함 : GetPageStride(), ScrollDirection.

다음에 의해서 참조됨 : MovePage(), UpdateContainerPositionDuringDrag().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetPageStride()

FORCEINLINE float UPageScrollView::GetPageStride ( ) const
inlineprivate

페이지 간 거리를 계산합니다.

반환값
페이지 크기 + 간격

UPageScrollView.h 파일의 94 번째 라인에서 정의되었습니다.

95 {
96 return (ScrollDirection == EPageScrollDirection::Horizontal)
97 ? (PageSize.X + PageSpacing)
99 }
FVector2D PageSize
각 페이지의 크기 (Width × Height)
float PageSpacing
페이지 간 간격 (픽셀)

다음에 의해서 참조됨 : CalculateTargetPage(), GetPagePosition(), SetNumberOfPages(), UpdateItemScales().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetTotalPages()

int32 UPageScrollView::GetTotalPages ( ) const
inline

총 페이지 수를 반환합니다.

반환값
총 페이지 수

UPageScrollView.h 파일의 63 번째 라인에서 정의되었습니다.

63{ return pageItemList.Num(); }

◆ MovePage()

void UPageScrollView::MovePage ( int32  PageIndex,
bool  bAnimate = true 
)

특정 페이지로 이동합니다.

매개변수
[in]PageIndex이동할 페이지 인덱스
[in]bAnimate애니메이션 여부

UPageScrollView.cpp 파일의 109 번째 라인에서 정의되었습니다.

110{
111 if (!pageItemList.IsValidIndex(PageIndex))
112 return;
113
114 int32 prevPage = CurPageIndex;
115 CurPageIndex = PageIndex;
116
117 FVector2D targetPosition = GetPagePosition(PageIndex);
118
119 // Phase 1: 애니메이션 없이 즉시 이동
120 if (!bAnimate || SnapAnimationSpeed <= 0.0f)
121 {
122 SetContainerPosition(targetPosition);
123
124 // 페이지 변경 이벤트 발생
125 if (prevPage != CurPageIndex)
126 {
127 OnPageChanged.Broadcast(prevPage, CurPageIndex);
128 }
129
130 // 인디케이터 업데이트
132
133 // 스케일 효과 업데이트
135 {
137 }
138 return;
139 }
140
141 // Phase 2에서 구현: 애니메이션 이동
142 UCanvasPanelSlot* containerSlot = Cast<UCanvasPanelSlot>(PageContainer->Slot);
143 if (!containerSlot)
144 {
145 SetContainerPosition(targetPosition);
146 return;
147 }
148
149 animStartPosition = containerSlot->GetPosition();
150 animTargetPosition = targetPosition;
151 animElapsedTime = 0.0f;
152 bIsAnimating = true;
153
154 // 타이머 시작
155 if (GetWorld())
156 {
157 GetWorld()->GetTimerManager().ClearTimer(snapAnimTimerHandle);
158 GetWorld()->GetTimerManager().SetTimer(
160 this,
162 0.016f, // ~60 FPS
163 true
164 );
165 }
166}
void UpdateItemScales()
페이지 아이템들의 스케일을 거리 기반으로 업데이트합니다.
FVector2D animTargetPosition
void SetContainerPosition(FVector2D Position)
컨테이너 위치를 설정합니다.
void TickSnapAnimation()
스냅 애니메이션을 Tick합니다.
void UpdatePageDotIndicator()
페이지 인디케이터를 업데이트합니다.
FVector2D animStartPosition
TObjectPtr< class UCanvasPanel > PageContainer
페이지 아이템들을 담을 컨테이너 (드래그로 위치 이동)
FVector2D GetPagePosition(int32 PageIndex) const
페이지 인덱스에 해당하는 목표 위치를 계산합니다.
FOnPageChanged OnPageChanged
페이지 변경 이벤트
FTimerHandle snapAnimTimerHandle
애니메이션 상태
float SnapAnimationSpeed
스냅 애니메이션 속도 (초 단위)
bool bEnableScaleEffect
중앙 스케일 효과 활성화 여부

다음을 참조함 : animElapsedTime, animStartPosition, animTargetPosition, bEnableScaleEffect, bIsAnimating, CurPageIndex, GetPagePosition(), OnPageChanged, PageContainer, pageItemList, SetContainerPosition(), SnapAnimationSpeed, snapAnimTimerHandle, TickSnapAnimation(), UpdateItemScales(), UpdatePageDotIndicator().

다음에 의해서 참조됨 : NativeConstruct(), NativeOnMouseButtonUp(), NextPage(), PrevPage(), SetNumberOfPages().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ NativeConstruct()

void UPageScrollView::NativeConstruct ( )
overrideprotectedvirtual

UPageScrollView.cpp 파일의 10 번째 라인에서 정의되었습니다.

11{
12 Super::NativeConstruct();
13
14 // 뷰포트 크기 계산 (SizeBox의 크기)
15 if (UCanvasPanelSlot* RootSlot = Cast<UCanvasPanelSlot>(Slot))
16 {
17 ViewportSize = RootSlot->GetSize();
18 }
19
20 // ViewportSize 계산 실패 시 PageSize 사용
21 if (ViewportSize.X <= 1.0f || ViewportSize.Y <= 1.0f)
22 {
24 }
25
26 // 기본 페이지로 이동 (애니메이션 없이)
27 if (pageItemList.Num() > 0 && pageItemList.IsValidIndex(DefaultPageIndex))
28 {
30 }
31}
void MovePage(int32 PageIndex, bool bAnimate=true)
특정 페이지로 이동합니다.
FVector2D ViewportSize
뷰포트 크기 (SizeBox에서 계산)
int32 DefaultPageIndex
기본으로 선택될 페이지 인덱스

다음을 참조함 : DefaultPageIndex, MovePage(), pageItemList, PageSize, ViewportSize.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ NativeDestruct()

void UPageScrollView::NativeDestruct ( )
overrideprotectedvirtual

UPageScrollView.cpp 파일의 33 번째 라인에서 정의되었습니다.

34{
35 Super::NativeDestruct();
36
37 // 타이머 정리
39}
void StopAnimation()
스냅 애니메이션을 중지합니다.

다음을 참조함 : StopAnimation().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ NativeOnMouseButtonDown()

FReply UPageScrollView::NativeOnMouseButtonDown ( const FGeometry &  InGeometry,
const FPointerEvent &  InMouseEvent 
)
overrideprotectedvirtual

마우스 버튼 다운 이벤트

UPageScrollView.cpp 파일의 41 번째 라인에서 정의되었습니다.

42{
43 if (!InMouseEvent.IsMouseButtonDown(EKeys::LeftMouseButton))
44 return FReply::Unhandled();
45
46 // 애니메이션 중지
48
49 // 드래그 시작
50 bIsDragging = true;
51 dragStartPosition = InMouseEvent.GetScreenSpacePosition();
53 dragStartTime = GetWorld() ? GetWorld()->GetTimeSeconds() : 0.0f;
55
56 // TakeWidget()으로 SWidget을 가져와서 Mouse Capture
57 TSharedPtr<SWidget> CachedWidget = GetCachedWidget();
58 if (CachedWidget.IsValid())
59 {
60 return FReply::Handled().CaptureMouse(CachedWidget.ToSharedRef());
61 }
62
63 return FReply::Handled();
64}
int32 PrevPageIndex
이전 페이지 인덱스 (스냅 계산용)
FVector2D dragCurrentPosition
bool bIsDragging
드래그 상태 추적
FVector2D dragStartPosition

다음을 참조함 : bIsDragging, CurPageIndex, dragCurrentPosition, dragStartPosition, dragStartTime, PrevPageIndex, StopAnimation().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ NativeOnMouseButtonUp()

FReply UPageScrollView::NativeOnMouseButtonUp ( const FGeometry &  InGeometry,
const FPointerEvent &  InMouseEvent 
)
overrideprotectedvirtual

마우스 버튼 업 이벤트

UPageScrollView.cpp 파일의 66 번째 라인에서 정의되었습니다.

67{
68 if (!bIsDragging)
69 return FReply::Unhandled();
70
71 bIsDragging = false;
72
73 // 드래그 거리 계산
74 FVector2D dragDelta = dragCurrentPosition - dragStartPosition;
75 float dragDistance = dragDelta.Size();
76
77 // 작은 드래그는 클릭으로 처리 (버튼 이벤트 전달)
78 if (dragDistance <= 10.0f)
79 {
80 return FReply::Handled().ReleaseMouseCapture();
81 }
82
83 // 드래그 속도 계산 (픽셀/초)
84 float dragTime = GetWorld() ? (GetWorld()->GetTimeSeconds() - dragStartTime) : 0.01f;
85 float velocity = dragDistance / FMath::Max(dragTime, 0.01f);
86
87 // 목표 페이지 계산
88 int32 targetPage = CalculateTargetPage(dragDelta, velocity);
89
90 // 목표 페이지로 이동
91 MovePage(targetPage, true);
92
93 return FReply::Handled().ReleaseMouseCapture();
94}
int32 CalculateTargetPage(FVector2D DragDelta, float Velocity) const
드래그 종료 시 목표 페이지를 계산합니다.

다음을 참조함 : bIsDragging, CalculateTargetPage(), dragCurrentPosition, dragStartPosition, dragStartTime, MovePage().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ NativeOnMouseMove()

FReply UPageScrollView::NativeOnMouseMove ( const FGeometry &  InGeometry,
const FPointerEvent &  InMouseEvent 
)
overrideprotectedvirtual

마우스 이동 이벤트

UPageScrollView.cpp 파일의 96 번째 라인에서 정의되었습니다.

97{
98 if (!bIsDragging)
99 return FReply::Unhandled();
100
101 dragCurrentPosition = InMouseEvent.GetScreenSpacePosition();
102
103 // 드래그 중 실시간 컨테이너 위치 업데이트
105
106 return FReply::Handled();
107}
void UpdateContainerPositionDuringDrag()
드래그 중 컨테이너 위치를 업데이트합니다.

다음을 참조함 : bIsDragging, dragCurrentPosition, UpdateContainerPositionDuringDrag().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ NextPage()

void UPageScrollView::NextPage ( )

다음 페이지로 이동합니다.

UPageScrollView.cpp 파일의 224 번째 라인에서 정의되었습니다.

225{
226 int32 targetPage = FMath::Clamp(CurPageIndex + 1, 0, pageItemList.Num() - 1);
227 MovePage(targetPage, true);
228}

다음을 참조함 : CurPageIndex, MovePage(), pageItemList.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ PrevPage()

void UPageScrollView::PrevPage ( )

이전 페이지로 이동합니다.

UPageScrollView.cpp 파일의 230 번째 라인에서 정의되었습니다.

231{
232 int32 targetPage = FMath::Clamp(CurPageIndex - 1, 0, pageItemList.Num() - 1);
233 MovePage(targetPage, true);
234}

다음을 참조함 : CurPageIndex, MovePage(), pageItemList.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SetContainerPosition()

void UPageScrollView::SetContainerPosition ( FVector2D  Position)
private

컨테이너 위치를 설정합니다.

매개변수
[in]Position설정할 위치

UPageScrollView.cpp 파일의 324 번째 라인에서 정의되었습니다.

325{
326 if (UCanvasPanelSlot* containerSlot = Cast<UCanvasPanelSlot>(PageContainer->Slot))
327 {
328 containerSlot->SetPosition(Position);
329 }
330}

다음을 참조함 : PageContainer.

다음에 의해서 참조됨 : MovePage().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetNumberOfPages()

void UPageScrollView::SetNumberOfPages ( int32  ItemCount)

페이지 개수를 설정하고 동적으로 생성합니다.

매개변수
[in]ItemCount생성할 페이지 수

UPageScrollView.cpp 파일의 168 번째 라인에서 정의되었습니다.

169{
171 return;
172
173 // 기존 페이지 제거
174 pageItemList.Empty();
175 PageContainer->ClearChildren();
176
177 // 새 페이지 생성
178 for (int32 i = 0; i < ItemCount; ++i)
179 {
180 UPageScrollItem* newItem = CreateWidget<UPageScrollItem>(GetWorld(), PageItemClass);
181 if (!newItem)
182 continue;
183
184 // 페이지 초기화
185 newItem->InitData(i, this);
186
187 // PageContainer에 추가
188 UCanvasPanelSlot* slot = PageContainer->AddChildToCanvas(newItem);
189 if (slot)
190 {
191 // 페이지 아이템 위치 설정 (0부터 오른쪽으로 배치)
192 float stride = GetPageStride();
193 FVector2D itemPosition;
194 if (ScrollDirection == EPageScrollDirection::Horizontal)
195 itemPosition = FVector2D(stride * i, 0.0f);
196 else
197 itemPosition = FVector2D(0.0f, stride * i);
198
199 slot->SetAnchors(FAnchors(0.0f, 0.0f, 0.0f, 0.0f)); // 왼쪽 위 고정
200 slot->SetAlignment(FVector2D(0.0f, 0.0f));
201 slot->SetPosition(itemPosition);
202 slot->SetSize(PageSize);
203 }
204
205 pageItemList.Add(newItem);
206 }
207
208 // 인디케이터 업데이트
210 {
211 PageDotIndicator->SetNumberOfPages(ItemCount);
212
213 // 페이지가 1개 이하면 인디케이터 숨김
214 PageDotIndicator->SetVisibility(ItemCount > 1 ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);
215 }
216
217 // 기본 페이지로 이동
218 if (pageItemList.Num() > 0 && pageItemList.IsValidIndex(DefaultPageIndex))
219 {
221 }
222}
페이지 스크롤 뷰의 개별 페이지 아이템 UPageScrollView에 의해 동적으로 생성되며, 개별 페이지의 콘텐츠를 담는 컨테이너입니다.
virtual void InitData(int32 InIndex, class UPageScrollView *InOwner)
페이지 아이템을 초기화합니다.
TObjectPtr< class UPageScrollDot > PageDotIndicator
페이지 인디케이터 (선택적)
TSubclassOf< class UPageScrollItem > PageItemClass
페이지 아이템으로 생성할 위젯 블루프린트 클래스

다음을 참조함 : DefaultPageIndex, GetPageStride(), UPageScrollItem::InitData(), MovePage(), PageContainer, PageDotIndicator, PageItemClass, pageItemList, PageSize, ScrollDirection.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ StopAnimation()

void UPageScrollView::StopAnimation ( )
private

스냅 애니메이션을 중지합니다.

UPageScrollView.cpp 파일의 306 번째 라인에서 정의되었습니다.

307{
308 if (GetWorld())
309 {
310 GetWorld()->GetTimerManager().ClearTimer(snapAnimTimerHandle);
311 }
312
313 bIsAnimating = false;
314}

다음을 참조함 : bIsAnimating, snapAnimTimerHandle.

다음에 의해서 참조됨 : NativeDestruct(), NativeOnMouseButtonDown(), TickSnapAnimation().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ TickSnapAnimation()

void UPageScrollView::TickSnapAnimation ( )
private

스냅 애니메이션을 Tick합니다.

UPageScrollView.cpp 파일의 263 번째 라인에서 정의되었습니다.

264{
265 // Canvas Slot 유효성 검사
266 UCanvasPanelSlot* containerSlot = Cast<UCanvasPanelSlot>(PageContainer->Slot);
267 if (!containerSlot)
268 {
270 return;
271 }
272
273 // 애니메이션 진행
274 animElapsedTime += 0.016f; // ~60 FPS 기준
275 const float Alpha = FMath::Clamp(animElapsedTime / SnapAnimationSpeed, 0.0f, 1.0f);
276
277 // Ease-out curve 적용
278 float easedAlpha = FMath::InterpEaseOut(0.0f, 1.0f, Alpha, 2.0f);
279
280 // Lerp를 사용한 부드러운 이동
281 FVector2D currentPosition = FMath::Lerp(animStartPosition, animTargetPosition, easedAlpha);
282 containerSlot->SetPosition(currentPosition);
283
284 // 스케일 효과 업데이트
286 {
288 }
289
290 // 애니메이션 완료 확인
291 if (Alpha >= 1.0f)
292 {
294
295 // 페이지 변경 이벤트 발생
297 {
299 }
300
301 // 인디케이터 업데이트
303 }
304}

다음을 참조함 : animElapsedTime, animStartPosition, animTargetPosition, bEnableScaleEffect, CurPageIndex, OnPageChanged, PageContainer, PrevPageIndex, SnapAnimationSpeed, StopAnimation(), UpdateItemScales(), UpdatePageDotIndicator().

다음에 의해서 참조됨 : MovePage().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateContainerPositionDuringDrag()

void UPageScrollView::UpdateContainerPositionDuringDrag ( )
private

드래그 중 컨테이너 위치를 업데이트합니다.

UPageScrollView.cpp 파일의 385 번째 라인에서 정의되었습니다.

386{
387 if (!bIsDragging)
388 return;
389
390 UCanvasPanelSlot* containerSlot = Cast<UCanvasPanelSlot>(PageContainer->Slot);
391 if (!containerSlot)
392 return;
393
394 // 드래그 델타 계산
395 FVector2D dragDelta = dragCurrentPosition - dragStartPosition;
396
397 // 이전 위치에서 드래그 델타만큼 이동
398 FVector2D basePosition = GetPagePosition(PrevPageIndex);
399 FVector2D newPosition = basePosition;
400
401 if (ScrollDirection == EPageScrollDirection::Horizontal)
402 newPosition.X += dragDelta.X;
403 else
404 newPosition.Y += dragDelta.Y;
405
406 containerSlot->SetPosition(newPosition);
407
408 // 스케일 효과 업데이트
410 {
412 }
413}

다음을 참조함 : bEnableScaleEffect, bIsDragging, dragCurrentPosition, dragStartPosition, GetPagePosition(), PageContainer, PrevPageIndex, ScrollDirection, UpdateItemScales().

다음에 의해서 참조됨 : NativeOnMouseMove().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateItemScales()

void UPageScrollView::UpdateItemScales ( )
private

페이지 아이템들의 스케일을 거리 기반으로 업데이트합니다.

UPageScrollView.cpp 파일의 340 번째 라인에서 정의되었습니다.

341{
343 return;
344
345 UCanvasPanelSlot* containerSlot = Cast<UCanvasPanelSlot>(PageContainer->Slot);
346 if (!containerSlot)
347 return;
348
349 FVector2D containerPos = containerSlot->GetPosition();
350 // ViewportSize 대신 PageSize 사용 (ViewportSize 계산이 실패할 수 있음)
351 float viewportCenter = (ScrollDirection == EPageScrollDirection::Horizontal)
352 ? PageSize.X * 0.5f
353 : PageSize.Y * 0.5f;
354
355 for (int32 i = 0; i < pageItemList.Num(); ++i)
356 {
357 UPageScrollItem* item = pageItemList[i];
358 if (!item)
359 continue;
360
361 // 페이지 아이템의 실제 위치 (0부터 오른쪽으로 배치됨)
362 float stride = GetPageStride();
363 FVector2D pagePos;
364 if (ScrollDirection == EPageScrollDirection::Horizontal)
365 pagePos = FVector2D(stride * i, 0.0f);
366 else
367 pagePos = FVector2D(0.0f, stride * i);
368
369 float pageCenter = (ScrollDirection == EPageScrollDirection::Horizontal)
370 ? (containerPos.X + pagePos.X + PageSize.X * 0.5f)
371 : (containerPos.Y + pagePos.Y + PageSize.Y * 0.5f);
372
373 float distance = FMath::Abs(pageCenter - viewportCenter);
374 float maxDistance = GetPageStride();
375 float normalizedDistance = FMath::Clamp(distance / maxDistance, 0.0f, 1.0f);
376
377 // Lerp from focus scale to side scale
378 float scale = FMath::Lerp(FocusScale, SideScale, normalizedDistance);
379
380 item->SetRenderScale(FVector2D(scale, scale));
381 item->UpdateFocusState(normalizedDistance < 0.1f, scale);
382 }
383}
void UpdateFocusState(bool bInFocused, float InScale)
포커스 상태를 업데이트합니다.
float SideScale
중앙에서 벗어난 페이지의 스케일 값
float FocusScale
중앙에 있는 페이지의 스케일 값

다음을 참조함 : bEnableScaleEffect, FocusScale, GetPageStride(), PageContainer, pageItemList, PageSize, ScrollDirection, SideScale, UPageScrollItem::UpdateFocusState().

다음에 의해서 참조됨 : MovePage(), TickSnapAnimation(), UpdateContainerPositionDuringDrag().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UpdatePageDotIndicator()

void UPageScrollView::UpdatePageDotIndicator ( )
private

페이지 인디케이터를 업데이트합니다.

UPageScrollView.cpp 파일의 332 번째 라인에서 정의되었습니다.

333{
335 {
336 PageDotIndicator->SetCurrentPage(CurPageIndex);
337 }
338}

다음을 참조함 : CurPageIndex, PageDotIndicator.

다음에 의해서 참조됨 : MovePage(), TickSnapAnimation().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ animElapsedTime

float UPageScrollView::animElapsedTime = 0.0f
private

UPageScrollView.h 파일의 188 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : MovePage(), TickSnapAnimation().

◆ animStartPosition

FVector2D UPageScrollView::animStartPosition = FVector2D::ZeroVector
private

UPageScrollView.h 파일의 186 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : MovePage(), TickSnapAnimation().

◆ animTargetPosition

FVector2D UPageScrollView::animTargetPosition = FVector2D::ZeroVector
private

UPageScrollView.h 파일의 187 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : MovePage(), TickSnapAnimation().

◆ bEnableScaleEffect

bool UPageScrollView::bEnableScaleEffect = false

중앙 스케일 효과 활성화 여부

UPageScrollView.h 파일의 137 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : MovePage(), TickSnapAnimation(), UpdateContainerPositionDuringDrag(), UpdateItemScales().

◆ bIsAnimating

bool UPageScrollView::bIsAnimating = false
private

UPageScrollView.h 파일의 189 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : MovePage(), StopAnimation().

◆ bIsDragging

bool UPageScrollView::bIsDragging = false
private

드래그 상태 추적

UPageScrollView.h 파일의 179 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeOnMouseButtonDown(), NativeOnMouseButtonUp(), NativeOnMouseMove(), UpdateContainerPositionDuringDrag().

◆ CurPageIndex

int32 UPageScrollView::CurPageIndex = 0
private

현재 선택된 페이지 인덱스

UPageScrollView.h 파일의 169 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : CalculateTargetPage(), MovePage(), NativeOnMouseButtonDown(), NextPage(), PrevPage(), TickSnapAnimation(), UpdatePageDotIndicator().

◆ DefaultPageIndex

int32 UPageScrollView::DefaultPageIndex = 0

기본으로 선택될 페이지 인덱스

UPageScrollView.h 파일의 153 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeConstruct(), SetNumberOfPages().

◆ dragCurrentPosition

FVector2D UPageScrollView::dragCurrentPosition = FVector2D::ZeroVector
private

UPageScrollView.h 파일의 181 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeOnMouseButtonDown(), NativeOnMouseButtonUp(), NativeOnMouseMove(), UpdateContainerPositionDuringDrag().

◆ dragStartPosition

FVector2D UPageScrollView::dragStartPosition = FVector2D::ZeroVector
private

UPageScrollView.h 파일의 180 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeOnMouseButtonDown(), NativeOnMouseButtonUp(), UpdateContainerPositionDuringDrag().

◆ dragStartTime

float UPageScrollView::dragStartTime = 0.0f
private

UPageScrollView.h 파일의 182 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeOnMouseButtonDown(), NativeOnMouseButtonUp().

◆ FastSwipeThreshold

float UPageScrollView::FastSwipeThreshold = 500.0f

빠른 스와이프 인식 임계값 (픽셀/초)

UPageScrollView.h 파일의 129 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : CalculateTargetPage().

◆ FocusScale

float UPageScrollView::FocusScale = 1.0f

중앙에 있는 페이지의 스케일 값

UPageScrollView.h 파일의 141 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UpdateItemScales().

◆ OnPageChanged

FOnPageChanged UPageScrollView::OnPageChanged

페이지 변경 이벤트

UPageScrollView.h 파일의 165 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : MovePage(), TickSnapAnimation().

◆ PageContainer

TObjectPtr<class UCanvasPanel> UPageScrollView::PageContainer

페이지 아이템들을 담을 컨테이너 (드래그로 위치 이동)

UPageScrollView.h 파일의 157 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : MovePage(), SetContainerPosition(), SetNumberOfPages(), TickSnapAnimation(), UpdateContainerPositionDuringDrag(), UpdateItemScales().

◆ PageDotIndicator

TObjectPtr<class UPageScrollDot> UPageScrollView::PageDotIndicator

페이지 인디케이터 (선택적)

UPageScrollView.h 파일의 161 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : SetNumberOfPages(), UpdatePageDotIndicator().

◆ PageItemClass

TSubclassOf<class UPageScrollItem> UPageScrollView::PageItemClass

페이지 아이템으로 생성할 위젯 블루프린트 클래스

UPageScrollView.h 파일의 149 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : SetNumberOfPages().

◆ pageItemList

TArray<TObjectPtr<class UPageScrollItem> > UPageScrollView::pageItemList
private

생성된 페이지 아이템 목록

UPageScrollView.h 파일의 176 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : CalculateTargetPage(), MovePage(), NativeConstruct(), NextPage(), PrevPage(), SetNumberOfPages(), UpdateItemScales().

◆ PageSize

FVector2D UPageScrollView::PageSize = FVector2D(1920.0f, 1080.0f)

각 페이지의 크기 (Width × Height)

UPageScrollView.h 파일의 121 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeConstruct(), SetNumberOfPages(), UpdateItemScales().

◆ PageSpacing

float UPageScrollView::PageSpacing = 0.0f

페이지 간 간격 (픽셀)

UPageScrollView.h 파일의 125 번째 라인에서 정의되었습니다.

◆ PrevPageIndex

int32 UPageScrollView::PrevPageIndex = 0
private

이전 페이지 인덱스 (스냅 계산용)

UPageScrollView.h 파일의 172 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeOnMouseButtonDown(), TickSnapAnimation(), UpdateContainerPositionDuringDrag().

◆ ScrollDirection

EPageScrollDirection UPageScrollView::ScrollDirection = EPageScrollDirection::Horizontal

스크롤 방향 (수평/수직)

UPageScrollView.h 파일의 117 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : CalculateTargetPage(), GetPagePosition(), SetNumberOfPages(), UpdateContainerPositionDuringDrag(), UpdateItemScales().

◆ SideScale

float UPageScrollView::SideScale = 0.8f

중앙에서 벗어난 페이지의 스케일 값

UPageScrollView.h 파일의 145 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UpdateItemScales().

◆ SnapAnimationSpeed

float UPageScrollView::SnapAnimationSpeed = 0.3f

스냅 애니메이션 속도 (초 단위)

UPageScrollView.h 파일의 133 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : MovePage(), TickSnapAnimation().

◆ snapAnimTimerHandle

FTimerHandle UPageScrollView::snapAnimTimerHandle
private

애니메이션 상태

UPageScrollView.h 파일의 185 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : MovePage(), StopAnimation().

◆ ViewportSize

FVector2D UPageScrollView::ViewportSize = FVector2D::ZeroVector
private

뷰포트 크기 (SizeBox에서 계산)

UPageScrollView.h 파일의 192 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : NativeConstruct().


이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: