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ピクセルのスペースを作ります
],
),
);
}
}
コメント