refactor(shared): animation, l10n, theme 모듈을 core에서 shared로 이동
- core/animation → shared/animation - core/l10n → shared/l10n - core/constants/ascii_colors → shared/theme/ascii_colors - import 경로 업데이트
This commit is contained in:
79
lib/src/shared/animation/canvas/ascii_canvas_widget.dart
Normal file
79
lib/src/shared/animation/canvas/ascii_canvas_widget.dart
Normal file
@@ -0,0 +1,79 @@
|
||||
import 'package:asciineverdie/src/shared/animation/canvas/ascii_canvas_painter.dart';
|
||||
import 'package:asciineverdie/src/shared/animation/canvas/ascii_layer.dart';
|
||||
import 'package:asciineverdie/src/shared/theme/ascii_colors.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
/// ASCII Canvas 위젯 (RepaintBoundary 포함)
|
||||
///
|
||||
/// AsciiCanvasPainter를 감싸는 위젯.
|
||||
/// RepaintBoundary로 성능 최적화.
|
||||
/// willChange를 애니메이션 상태에 따라 동적 설정.
|
||||
/// 테마 인식 색상 자동 적용 (Phase 5).
|
||||
class AsciiCanvasWidget extends StatelessWidget {
|
||||
const AsciiCanvasWidget({
|
||||
super.key,
|
||||
required this.layers,
|
||||
this.gridWidth = 60,
|
||||
this.gridHeight = 8,
|
||||
this.backgroundOpacity = 0.5,
|
||||
this.isAnimating = true,
|
||||
this.layerVersion = 0,
|
||||
});
|
||||
|
||||
/// 렌더링할 레이어 목록
|
||||
final List<AsciiLayer> layers;
|
||||
|
||||
/// 그리드 너비 (열 수)
|
||||
final int gridWidth;
|
||||
|
||||
/// 그리드 높이 (행 수)
|
||||
final int gridHeight;
|
||||
|
||||
/// 배경 투명도 (0.0 ~ 1.0, 기본값 0.5 = 50%)
|
||||
final double backgroundOpacity;
|
||||
|
||||
/// 애니메이션 활성 상태 (willChange 최적화용)
|
||||
final bool isAnimating;
|
||||
|
||||
/// 레이어 버전 (변경 감지용, shouldRepaint 최적화)
|
||||
final int layerVersion;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// 테마 인식 색상 (다크/라이트 모드 자동 전환)
|
||||
final bgColor = AsciiColors.backgroundOf(context);
|
||||
final objColor = AsciiColors.objectOf(context);
|
||||
final posColor = AsciiColors.positiveOf(context);
|
||||
final negColor = AsciiColors.negativeOf(context);
|
||||
|
||||
// 무기 등급 색상 (Phase 9)
|
||||
final uncommonColor = AsciiColors.rarityUncommonOf(context);
|
||||
final rareColor = AsciiColors.rarityRareOf(context);
|
||||
final epicColor = AsciiColors.rarityEpicOf(context);
|
||||
final legendaryColor = AsciiColors.rarityLegendaryOf(context);
|
||||
|
||||
return RepaintBoundary(
|
||||
child: CustomPaint(
|
||||
painter: AsciiCanvasPainter(
|
||||
layers: layers,
|
||||
gridWidth: gridWidth,
|
||||
gridHeight: gridHeight,
|
||||
backgroundColor: bgColor,
|
||||
backgroundOpacity: backgroundOpacity,
|
||||
layerVersion: layerVersion,
|
||||
objectColor: objColor,
|
||||
positiveColor: posColor,
|
||||
negativeColor: negColor,
|
||||
rarityUncommonColor: uncommonColor,
|
||||
rarityRareColor: rareColor,
|
||||
rarityEpicColor: epicColor,
|
||||
rarityLegendaryColor: legendaryColor,
|
||||
),
|
||||
size: Size.infinite,
|
||||
isComplex: true,
|
||||
// 애니메이션 중일 때만 willChange 활성화
|
||||
willChange: isAnimating,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user