import 'dart:async'; import 'dart:math'; import 'package:flutter/material.dart'; import 'dart:ui' as ui; class CanvasCustomText extends StatefulWidget { const CanvasCustomText({super.key}); @override State<CanvasCustomText> createState() => _CanvasCustomTextState(); }
class _CanvasCustomTextState extends State<CanvasCustomText> with TickerProviderStateMixin{
Timer? _timer; List _sounds=[]; @override void initState() { // TODO: implement initState super.initState(); if(_timer!=null){ _timer?.cancel(); } _timer=Timer.periodic(Duration(milliseconds: 400), (timer) { double w=MediaQuery.of(context).size.width; double num=w/8; Random _random = new Random(DateTime.now().microsecondsSinceEpoch); if(_sounds.length>num){ _sounds.removeAt(0); } _sounds.add({ 'size': (_random.nextDouble()*10)*4 }); setState(() { }); }); }
@override void dispose() { // TODO: implement dispose super.dispose(); _timer?.cancel(); }
@override Widget build(BuildContext context) { var animSound=CustomPaint( painter: CustomSoundSizeAnim(soundList: _sounds), ); return Scaffold( resizeToAvoidBottomInset: false, body:ListView( children: [ Container( height: 200, margin: EdgeInsets.only(top: 40), width: double.infinity, decoration: BoxDecoration( border: Border.all(color: Colors.black38) ), child:animSound ) ], ) ); }
class CustomSoundSizeAnim extends CustomPainter{ List? soundList; CustomSoundSizeAnim( { this.soundList }); Paint? _paint; @override void paint(Canvas canvas, Size size) { _paint=Paint()..color=Colors.orange; // TODO: implement paint drawRect(canvas,size); } drawRect(Canvas canvas,Size size){ double count=(size.width/8); soundList=[...soundList!.reversed]; for(int i=0;i<count;i++){ canvas.drawRRect(RRect.fromRectXY(Rect.fromCenter(center: Offset(i*8, 100), width:4, height:4), 8, 8), _paint!); } for(int i=0;i<soundList!.length;i++){ canvas.drawRRect(RRect.fromRectXY(Rect.fromCenter(center: Offset(i*8, 100), width:4, height: soundList![i]['size']), 8, 8), _paint!); } } @override bool shouldRepaint(covariant CustomPainter oldDelegate) { // TODO: implement shouldRepaint return true; } }
}