From da2a103920ece9d4484a35cc45727f714c9ad6ee Mon Sep 17 00:00:00 2001 From: Chen Li <422043296@qq.com> Date: Wed, 13 Aug 2025 09:23:09 +0800 Subject: [PATCH] thinking image --- assets/images/thinking_circle.png | Bin 0 -> 2542 bytes lib/widgets/chat_bubble.dart | 19 +++++++----- lib/widgets/rotating_image.dart | 49 ++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 assets/images/thinking_circle.png create mode 100644 lib/widgets/rotating_image.dart diff --git a/assets/images/thinking_circle.png b/assets/images/thinking_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..3b80739d73524b1754d950a641d5eccec88a6943 GIT binary patch literal 2542 zcmV*P)nMKt=oS5$S?(sY4-d8{A)O7Wqs~ou8_g;0? z`@Zv?bMCpfiJsb1JCrdUfwfy(^#??Yg`;zif^P(Jiv>}=5Uv;Gs31QmiF>8aBDaHc z-9L2Zx^x6~C<5))KbsFp&I!8<0C+k$Vg-zAfM(3jhLMo;Jb1e=#SM0dJH+nlUpl8Y z>40`10y4++XZ=PWEV@ zwl4x2Dz)%%74KaEU;$9Z`zbh11eA<=Ux^S838?4AB}KRb9iNG}`}nzEr|{@Xw=*}G z71PWF)>?NP+ojwJP8#9>-areB*Ey0<@BkjkC<%rddS9tQNr@r&(X2#vlvwaR%H4AJ zx3j4+6M?nXJBww>w-CPdz(SSRai7A6;6mFxDsKgL<%R2P^lqfVO1$n zg;uHeejo%T_8{@01lC@>+YsVglF^yq0n`Dsk*H=O;E>Xjkq`y%XaqhIOGJ1WMhZSu zAr*K;A`vLVFxdy#c5}Bxo8;vkh1amJ4DTya0wwp#EJkT=f8Wl7#}Kn*2?whpMw`YZYz zVo_gQxB|$_jvmdw{<8&sDb1IKp7ONYlj7|cKt^SZO+0q&Y}`7FHH$HC88>(M6J*jrS8qagOMO;x5+_$yDK__r50QTkWm- zR07|Bq2Gk(>jg5laGrMneg`Db4o4DB8#R3cztY~ApSfSz%Qo6e1DDf9D8QVHm>PK; zoMvwXN(H|-l>q+qtSv+ck?o+s9TL|AbZUW>h~s;&{$hTEj@Yh$ccF{i8h`-V$b!uk z5tme;JhY|~fU}$0oQ1T?7OH@@y&6U?BPD{Ld5ez8LXFlL#X?0k5;dq%L%OLFwV@)7 z@$Y04KafdXQe&nou2|25rIz&ppgXIZ9Xc*^;Wl|KjCc!*hZSwH4@76Qi2CT$G>rgq zw~@eWw}~|Xr88sgb1a#GA9~~m-aYMUS<%xKGgfyQ)_ARlT2`%lCpta;mB}1%d^&l<@Nmb{PK#@Cm6`hHt`P?02;Y8@idaLVDzJj{)MXHo$G)dp?Y zX=ZHKV%?{0UWAU>M1h+C>T-Reouk;wW6Fd{2$M;i(I9BY>5WYEzSABE-KLTPiA$II z4LT;faN|xrItq#_kt}w-n$Uz1a!cyLR004zh(MzXl0fSZQo2Wz*Pvsv;zYJ6IeeYN z>j>c#P8^g-4*%mC_dS|M0AJh$NR~vx!YKCo5=PI?(lHsl-U?Z&fEvC4ja;zVLaU}j zrYnH>zn8oo706;T>knEO84+2bW3rIBa~S5V(n848s0hTuQlsuv0?6^saJy*9n^f>A z!HtO2zw(`alaAQF^n2_PGCrf*(^5g}&JQHY%#?|atf9u#==M|s*$LVN>p?noFi*s? zD%Cz%?75R0t#-doM`W#=TlJlcS8dM$@Fi3zGo9JM!EtG=J8oC%%E3ZEO{U`2; zzxs{7p1?JSB!(q5Dl@vbMJ|zxE4H=Zn&jMr zA|1)xTPIG@X6NOoO7rHw8#p_`{|)FY)|D0Qdd;)i^PAV>b`pW2ixvJvj|_sHeAqKC zul@D;Pp<5Xz=f55edna$U`spHQE64rkFC_YN~@QI^mNXRg{xzODpl>s7^%whqUua2V$XDq(W6T2!hGm^??1aa|FOd# zuUFPu>o@SaTe^rA?KXCCYl+DgR7ADU-|8E2)$lQFdS=8KFBw^G3mxk6D zD$J!#&_KIffZZ&(yyu)pQ}$qUb7}tA4hWvwQ=8HL2iU|CM&ce0;{X5v07*qoM6N<$ Eg2{y2IRF3v literal 0 HcmV?d00001 diff --git a/lib/widgets/chat_bubble.dart b/lib/widgets/chat_bubble.dart index 9e1ad84..558d749 100644 --- a/lib/widgets/chat_bubble.dart +++ b/lib/widgets/chat_bubble.dart @@ -1,4 +1,5 @@ import 'package:ai_chat_assistant/utils/common_util.dart'; +import 'package:ai_chat_assistant/widgets/rotating_image.dart'; import 'package:basic_intl/intl.dart'; import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; @@ -127,6 +128,11 @@ class _ChatBubbleState extends State { case MessageStatus.listening: case MessageStatus.recognizing: case MessageStatus.thinking: + icon = RotatingImage( + imagePath: 'assets/images/thinking_circle.png' + ); + color = Colors.white; + break; case MessageStatus.executing: icon = const SizedBox( width: 16, @@ -349,13 +355,12 @@ class _ChatBubbleState extends State { }); }, child: Padding( - padding: const EdgeInsets.only(left: 12), - child: _disliked - ? Image.asset('assets/images/disliked2.png', - width: 20, height: 20) - : Image.asset('assets/images/disliked1.png', - width: 20, height: 20) - ), + padding: const EdgeInsets.only(left: 12), + child: _disliked + ? Image.asset('assets/images/disliked2.png', + width: 20, height: 20) + : Image.asset('assets/images/disliked1.png', + width: 20, height: 20)), ), ], ), diff --git a/lib/widgets/rotating_image.dart b/lib/widgets/rotating_image.dart new file mode 100644 index 0000000..6ce1ec6 --- /dev/null +++ b/lib/widgets/rotating_image.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +class RotatingImage extends StatefulWidget { + final String imagePath; + final double size; + final Duration duration; + + const RotatingImage({ + Key? key, + required this.imagePath, + this.size = 20, + this.duration = const Duration(seconds: 3) + }) : super(key: key); + + @override + State createState() => _RotatingImageState(); +} + +class _RotatingImageState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: widget.duration, + vsync: this, + )..repeat(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return RotationTransition( + turns: _controller, + child: Image.asset( + widget.imagePath, + width: widget.size, + height: widget.size + ), + ); + } +}