[flutter] 플러터에서의 Stack 위젯을 이용한 화면 밀기 효과 구현 방법

플러터에서는 Stack 위젯을 사용하여 다양한 레이아웃을 구성할 수 있습니다. 이 중에서도 화면을 밀기 효과를 주는 기능을 구현하고 싶다면 Stack 위젯을 활용할 수 있습니다.

Step 1: Stack 위젯을 사용하여 기본적인 레이아웃 구성하기

먼저, Stack 위젯을 사용하여 기본적인 레이아웃을 구성해야 합니다. 이때, Stack 위젯 안에는 여러 위젯들을 배치할 수 있습니다. 예를 들어, 화면의 위쪽에는 머리글을 표시하고, 중앙에는 내용을 표시하고, 아래쪽에는 하단 메뉴를 표시하는 레이아웃을 구성할 수 있습니다.

Stack(
  children: [
    Positioned(
      top: 0,
      left: 0,
      right: 0,
      child: AppBar(
        title: Text('플러터 화면 밀기 효과'),
      ),
    ),
    Positioned(
      top: kToolbarHeight,
      left: 0,
      right: 0,
      bottom: kToolbarHeight,
      child: Center(
        child: Text('내용을 표시하는 부분'),
      ),
    ),
    Positioned(
      left: 0,
      right: 0,
      bottom: 0,
      child: BottomNavigationBar(
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: '홈',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.settings),
            label: '설정',
          ),
        ],
      ),
    ),
  ],
)

Step 2: GestureDetector를 사용하여 화면을 밀기 효과 구현하기

이제 GestureDetector를 사용하여 화면을 밀기 효과를 구현할 수 있습니다. GestureDetector는 사용자의 터치 동작을 감지하고 이벤트를 처리할 수 있는 도구입니다.

class PushEffectScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanUpdate: (details) {
        if (details.delta.dy > 0) {
          // 아래로 스와이프
          print('아래로 스와이프');
        } else if (details.delta.dy < 0) {
          // 위로 스와이프
          print('위로 스와이프');
        }
      },
      child: Stack(
        children: [
          // 위젯들을 배치한 코드는 Step 1에서 구현한 코드와 동일합니다.
        ],
      ),
    );
  }
}

위의 코드에서 onPanUpdate 이벤트를 사용하여 사용자가 화면을 터치하여 드래그 할 때마다 해당 동작을 감지하고 처리할 수 있습니다. 여기서는 deltaY 값에 따라 아래로 스와이프와 위로 스와이프를 구분하여 처리하도록 했습니다.

Step 3: 화면 이동 애니메이션 구현하기

만약 화면을 밀기 효과와 함께 이동 애니메이션을 구현하고 싶다면, AnimatedContainer를 사용하여 화면 이동 애니메이션을 구현할 수 있습니다. AnimatedContainer는 지정된 시간 동안 속성을 변경하여 애니메이션 효과를 자동으로 생성해줍니다.

class PushEffectScreen extends StatelessWidget {
  double yOffset = 0;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanUpdate: (details) {
        if (details.delta.dy > 0) {
          // 아래로 스와이프
          yOffset = 100;
        } else if (details.delta.dy < 0) {
          // 위로 스와이프
          yOffset = -100;
        }
      },
      child: AnimatedContainer(
        duration: Duration(milliseconds: 300),
        transform: Matrix4.translationValues(0, yOffset, 0),
        child: Stack(
          children: [
            // 위젯들을 배치한 코드는 Step 1에서 구현한 코드와 동일합니다.
          ],
        ),
      ),
    );
  }
}

위의 코드에서 yOffset 변수를 사용하여 화면의 Y축 이동 값을 조정합니다. 이때, AnimatedContainer의 transform 속성을 사용하여 y값을 변경하면서 애니메이션 효과를 생성합니다. 이동 애니메이션을 원하는 시간(duration)으로 설정할 수 있으며, 위 코드에서는 300밀리초로 설정했습니다.

이제 플러터에서 Stack 위젯을 사용하여 화면 밀기 효과를 구현하는 방법을 알게 되었습니다. 위의 코드를 참고하여 원하는 레이아웃과 효과를 구현해보세요.

참고 자료

  1. Flutter 공식 문서 - Stack 클래스
  2. Flutter 공식 문서 - GestureDetector 클래스
  3. Flutter 공식 문서 - AnimatedContainer 클래스