Flutterネタ

import 'package:flutter/material.dart';
import 'dart:math';
import 'dart:math' as math;
import 'add_roulette_item_page.dart';

class RoulettePage extends StatefulWidget {
  @override
  _RoulettePageState createState() => _RoulettePageState();
}

class _RoulettePageState extends State<RoulettePage> with SingleTickerProviderStateMixin {
  List<String> itemHistory = [];
  List<String> allItems = ["膝を使う","スレッドを入れる","チェアーで終わる","ヘッドを使う","ジョーダンで終わる","2段階以上のフリーズ","トップロックだけ","フットワークだけ"];
  String selectedItem = '';
  late AnimationController _animationController;
  late Animation<double> _animation;
  Random _random = Random();
  late int _selectedIndex;

  void _addItem(String item) {
    setState(() {
      allItems.add(item);
    });
  }

  void _editItem(int index, String newItem) {
    setState(() {
      allItems[index] = newItem;
    });
  }

  void _deleteItem(int index) {
    setState(() {
      allItems.removeAt(index);
    });
  }

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(vsync: this, duration: Duration(seconds: 2));
    _animation = Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: _animationController, curve: Curves.decelerate))
      ..addListener(() {
        setState(() {});
      })
      ..addStatusListener((status) {
        if (status == AnimationStatus.completed) {
          _selectRandomItem();
        }
      });
    _selectedIndex = 0;
  }

  void _selectRandomItem() {
    final int randomIndex = _random.nextInt(allItems.length);
    setState(() {
      _selectedIndex = randomIndex;
      selectedItem = allItems[randomIndex];
    });
  }

  @override
  void dispose() {
    _animationController.dispose();
    // _scrollController.dispose();
    super.dispose();
  }

  void _spinRoulette() {
    _animationController.forward(from: 0.0);
    // setState(() {
    //   final random = Random();
    //   int index = random.nextInt(allItems.length);
    //   selectedItem = allItems[index];
    //
    //   _animationController.reset();
    //   _animationController.forward();
    //   // アニメーション終了後の処理を追加する場合はここに記述
    // });
  }

  void _navigateAndAddItem() async {
    final newItem = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => AddRouletteItemPage()),
    );
    if (newItem != null) {
      setState(() {
        allItems.add(newItem);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    final double offset = _animation.value * allItems.length * 50; // 50 is the height of each item
    return Scaffold(
      appBar: AppBar(
        title: Text('【CLC】Concept-Limited Cypher (コンセプト縛りCypher)'),
        backgroundColor: Color(0xFF212121),
      ),
      body: Column(
        children: <Widget>[

          SizedBox(height: 50), // ボタン間のスペースを追加
          Text('選ばれたコンセプト\n『 $selectedItem 』',
            textAlign: TextAlign.center, // テキストを中央揃えにする
            style: TextStyle(
              fontSize: 24.0, // フォントサイズを24ピクセルに設定
              height: 2.0, // 行の高さをフォントサイズの1.5倍に設定
            ),
          ),
          // Add buttons for adding allItems

          SizedBox(height: 50), // ボタン間のスペースを追加
          ElevatedButton(
            onPressed: _spinRoulette,
            child: Text('ルーレットを回す'),
            style: ElevatedButton.styleFrom(
              primary: Color(0xFF212121),
            ),
          ),

      Expanded(
        child: AnimatedBuilder(
            animation: _animation,
            builder: (context, child) {
              // ここで回転アニメーションを適用する
              final angle = _animation.value * 2 * math.pi * 5; // 5回転分の角度
              return Transform(
                alignment: Alignment.center,
                transform: Matrix4.rotationZ(angle),
                child: child,
              );
            },
            child: Column(
              children: allItems.map((item) => Text(item, style: TextStyle(fontSize: 30))).toList(),
            ),
        ),
      ),

          SizedBox(height: 0), // ボタン間のスペースを追加
          ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => AddRouletteItemPage()),
              );
            },
            child: Text('ルーレット項目を追加'),
            style: ElevatedButton.styleFrom(
              primary: Color(0xFF212121),
            ),
          ),
          SizedBox(height: 20.0), // ここで下に16ピクセルのスペースを作ります
        ],
      ),
    );
  }
}

コメント

タイトルとURLをコピーしました