| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- import 'dart:typed_data';
- import 'package:flutter/material.dart';
- import 'package:flutter/services.dart';
- import 'package:image_puzzle/config/device.dart';
- import 'package:image_puzzle/models/download.dart';
- import 'package:image_puzzle/models/items.dart';
- import 'package:logging/logging.dart';
- import 'dart:ui' as ui;
- final Logger _log = Logger('home_board');
- enum HomeBoardStatus { loading, shuffle, playing, done, unlocking }
- class HomeBoard {
- final Device device;
- // 原合集图
- ui.Image? image;
- // 纸牌背面图
- late ui.Image cardImage;
- // board 的canvas绘制区域尺寸
- final double canvasWidth;
- final double canvasHeight;
- /// 一张合集分为几宫格,固定5x5
- final int rows = 5;
- final int cols = 5;
- // 每个piece的逻辑尺寸
- double get pieceLogicalWidth => canvasWidth / cols;
- double get pieceLogicalHeight => canvasHeight / rows;
- ValueNotifier boardNotifier = ValueNotifier(1);
- HomeBoardStatus status = HomeBoardStatus.loading;
- ListItem? _currentCollectionItem;
- ListItem? get currentCollectionItem => _currentCollectionItem;
- set currentCollectionItem(ListItem? item) {
- if (item == null) return;
- if (_currentCollectionItem == null || _currentCollectionItem!.id != item.id) {
- _currentCollectionItem = item;
- _loadImage();
- }
- }
- ValueNotifier isReadyNotifier = ValueNotifier(false);
- // 用于存储合集解锁动画相关信息
- Offset _unlockTargetOffset = Offset.zero;
- double _unlockTargetScale = 1.0;
- Offset get unlockTargetOffset => _unlockTargetOffset;
- double get unlockTargetScale => _unlockTargetScale;
- void setUnlockAnimationTarget({required Offset targetOffset, required double targetScale}) {
- _unlockTargetOffset = targetOffset;
- _unlockTargetScale = targetScale;
- }
- HomeBoard({required this.canvasWidth, required this.canvasHeight, required this.device}) {
- _loadCardImage();
- }
- void invalidate() {
- boardNotifier.value++;
- }
- // 加载合集图
- void _loadImage() async {
- double dpr = device.devicePixelRatio;
- ItemLoader itemLoader = ItemLoader.load(currentCollectionItem!);
- image = await itemLoader.getImageBySize((canvasWidth * dpr).round(), (canvasHeight * dpr).round());
- isReadyNotifier.value = true;
- invalidate();
- }
- // 加载卡片图
- void _loadCardImage() async {
- double dpr = device.devicePixelRatio;
- // 加载扑克背面图片,用于制作发牌动画
- final Size bestCardImageSize = Size(pieceLogicalWidth * dpr, pieceLogicalHeight * dpr);
- final ByteData cardData = await rootBundle.load('assets/images/backcard_green.png');
- final ui.Codec cardCodec = await ui.instantiateImageCodec(
- cardData.buffer.asUint8List(),
- targetWidth: bestCardImageSize.width.round(),
- targetHeight: bestCardImageSize.height.round(),
- );
- final ui.FrameInfo cardFrameInfo = await cardCodec.getNextFrame();
- cardImage = cardFrameInfo.image;
- invalidate();
- }
- }
|