[flutter] getX 함수를 사용하여 드래그 이벤트로 움직이는 위젯에 공기 저항 적용하기

소개

Flutter에서 getX 함수는 간단한 드래그 이벤트를 처리하기 위해 사용되는 함수입니다. 이 함수를 사용하여 위젯이 드래그 이벤트에 반응하게 만들 수 있습니다. 이번 튜토리얼에서는 getX 함수를 사용하여 드래그로 움직이는 위젯에 공기 저항 효과를 추가해보겠습니다.

시작하기 전에

이 튜토리얼을 따라하기 위해서는 Flutter와 getX 패키지가 설치되어 있어야 합니다. Flutter 공식 홈페이지(https://flutter.dev)나 getX GitHub 저장소(https://github.com/jonataslaw/getx)에서 설치 방법을 확인할 수 있습니다.

공기 저항 효과 구현하기

  1. 먼저 getX 패키지를 프로젝트에 추가합니다.

    dependencies:
      flutter:
        sdk: flutter
      get:
    
  2. 드래그로 움직이는 위젯을 생성합니다.

    class DraggableWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final controller = Get.put(DraggableController());
    
        return GestureDetector(
          onPanUpdate: (details) {
            controller.setPosition(details.delta.dx, details.delta.dy);
          },
          child: GetBuilder<DraggableController>(
            builder: (_) => Positioned(
              left: controller.x,
              top: controller.y,
              child: Container(
                width: 100,
                height: 100,
                color: Colors.blue,
              ),
            ),
          ),
        );
      }
    }
    

    위 코드에서는 DraggableWidget을 생성하고, GestureDetector를 사용하여 드래그 이벤트를 감지하고, GetBuilder를 사용하여 위치를 업데이트합니다. DraggableController의 x와 y 변수를 사용하여 위젯의 위치를 조정합니다.

  3. DraggableController 클래스를 생성합니다.

    class DraggableController extends GetxController {
      double x = 0.0;
      double y = 0.0;
    
      void setPosition(double dx, double dy) {
        x += dx;
        y += dy;
        update();
      }
    }
    

    위 코드에서는 getX의 GetxController를 상속받은 DraggableController를 생성하고, x와 y 변수를 사용하여 위치를 저장하고, setPosition 함수를 통해 위치를 업데이트합니다.

  4. 이제 DraggableWidget을 화면에 표시하기 위해 메인 화면을 수정합니다.

    void main() {
      runApp(MaterialApp(
        home: Scaffold(
          body: SafeArea(
            child: Stack(
              children: [
                DraggableWidget(),
              ],
            ),
          ),
        ),
      ));
    }
    

    위 코드에서는 SafeArea와 Stack을 사용하여 DraggableWidget을 화면에 배치합니다.

  5. 앱을 실행하면 드래그로 움직이는 파란색 정사각형이 나타날 것입니다. 그러나 현재는 드래그에 아무런 공기 저항 효과가 없습니다.

  6. 이제 getX 패키지에서 제공하는 이니셜리즈함수를 사용하여 공기 저항 효과를 구현해보겠습니다. DraggableController의 setPosition 함수의 코드를 수정합니다.

    void setPosition(double dx, double dy) {
      x = x.isNegative ? x + dx : x - dx;
      y = y.isNegative ? y + dy : y - dy;
    
      if (x > 0) {
        x = math.max(0, x - 1);
      } else if (x < 0) {
        x = math.min(0, x + 1);
      }
    
      if (y > 0) {
        y = math.max(0, y - 1);
      } else if (y < 0) {
        y = math.min(0, y + 1);
      }
    
      update();
    }
    

    위 코드에서는 x와 y가 양수일 경우 1을 뺄셈하고, 음수일 경우 1을 덧셈하여 공기 저항 효과를 구현합니다. math.max와 math.min 함수를 사용하여 위치가 0을 넘어가지 않도록 제한합니다.

  7. 앱을 다시 실행하면 드래그 이벤트로 움직이는 위젯에 공기 저항 효과가 적용된 것을 확인할 수 있습니다.

결론

이번 튜토리얼에서는 getX 함수를 사용하여 드래그 이벤트로 움직이는 위젯에 공기 저항 효과를 구현하는 방법을 알아보았습니다. getX 패키지를 사용하면 간단하게 드래그 이벤트를 처리하고 움직이는 위젯에 다양한 효과를 추가할 수 있습니다.