애니메이션 라이브러리 적용!

🦥 Animation 라이브러리 적용

사용할 방법

confetti(컨페티 : 색종이) 라이브러리 사용!

confetti 라이브러리를 사용해서 응모하기 버튼을 누르고 당첨 되었을때의 액션을 만들어보기로 한다.

선택 이유 ?

우선은 시간적 여유가 그렇게 많지 않고, 빠르게 결과물을 만들어서 보고 싶은 나의 욕심 !!

라이브러리 설치해서 빠르게 구현해보겠다.

(예상 구현 시간 : 최대 1시간, 너무 신경써서 만들진 말자 경험 위주)

개발환경 준비

// pubspec.yaml

// 라이브러리 추가
get: ^4.6.5
confetti: ^0.7.0

코드 작성

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const GetMaterialApp(
      home: Scaffold(body: TestWidget()),
    );
  }
}

class TestWidget extends StatefulWidget {
  const TestWidget({Key? key}) : super(key: key);

  @override
  State<TestWidget> createState() => _TestWidgetState();
}

class _TestWidgetState extends State<TestWidget> {
	late ConfettiController _controllerTopCenter;

	@override
	  void initState() {
	    super.initState();
			_controllerTopCenter = ConfettiController(
				duration: const Duration(milliseconds: 600)
			);
		}
	
	@override
  void dispose() {
		_controllerTopCenter.dispose();
		super.dispose();
	}
}
Align(
  alignment: Alignment.topCenter,
  child: ConfettiWidget(
    confettiController: _controllerTopCenter,
    // 송풍 방향
    blastDirection: pi / 2,
    // 최대 폭발력
    maxBlastForce: 2,
    // 최소 폭발력
    minBlastForce: 1,
    // 방출 빈도
    emissionFrequency: 0.1,
    // 입자 수
    numberOfParticles: 10,
    // 중력
    gravity: 1,
  ),
),
Align(
  alignment: Alignment.topCenter,
  child: TextButton(
      onPressed: () {
        _controllerTopCenter.play();
      },
      child: const Text('당첨(아래로)!')),
),
Align(
    alignment: Alignment.center,
    child: ConfettiWidget(
      confettiController: _controllerCenter,
      // 송풍 방향
      blastDirectionality: BlastDirectionality.explosive,
      // 무한 여부
      shouldLoop: false,
      // 색상
      colors: const [
        Colors.green,
        Colors.blue,
        Colors.pink,
        Colors.orange,
        Colors.purple
      ],
      // 커스텀 위젯을 넣는 부분
      createParticlePath: drawStar,
    ),
  ),
  Align(
    alignment: Alignment.center,
    child: TextButton(
        onPressed: () => checkResults(), child: const Text('응모\n확인')),
  ),
// 별 그리는 커스텀
  Path drawStar(Size size) {
    double degToRad(double deg) => deg * (pi / 180.0);

    const numberOfPoints = 5;
    final halfWidth = size.width / 2;
    final externalRadius = halfWidth;
    final internalRadius = halfWidth / 2.5;
    final degreesPerStep = degToRad(360 / numberOfPoints);
    final halfDegreesPerStep = degreesPerStep / 2;
    final path = Path();
    final fullAngle = degToRad(360);
    path.moveTo(size.width, halfWidth);

    for (double step = 0; step < fullAngle; step += degreesPerStep) {
      path.lineTo(halfWidth + externalRadius * cos(step),
          halfWidth + externalRadius * sin(step));
      path.lineTo(halfWidth + internalRadius * cos(step + halfDegreesPerStep),
          halfWidth + internalRadius * sin(step + halfDegreesPerStep));
    }

    path.close();
    return path;
  }

Categories:

Updated:

Leave a comment