From d65734a87bfd9d7bd438ac1219d0d57d09be2dcc Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 28 Nov 2020 22:09:12 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=9B=B4=E6=96=B0=E7=BB=98?= =?UTF-8?q?=E5=88=B6=E9=9B=86=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/iconfont/iconfont.ttf | Bin 9572 -> 9436 bytes assets/images/anim_draw.webp | Bin 0 -> 8206 bytes assets/images/base_draw.webp | Bin 0 -> 3566 bytes assets/images/draw_bg3.webp | Bin 0 -> 7676 bytes assets/images/draw_bg4.webp | Bin 0 -> 9494 bytes lib/app/res/size_unit.dart | 10 + lib/app/res/toly_icon.dart | 2 +- lib/components/permanent/feedback_widget.dart | 1 + .../items/gallery/gallery_card_item.dart | 80 +++++++ .../pages/app/navigation/unit_bottom_bar.dart | 207 +++++++++--------- .../pages/app/navigation/unit_navigation.dart | 4 - lib/views/pages/gallery/gallery_unit.dart | 140 ++++++------ 12 files changed, 269 insertions(+), 175 deletions(-) create mode 100644 assets/images/anim_draw.webp create mode 100644 assets/images/base_draw.webp create mode 100644 assets/images/draw_bg3.webp create mode 100644 assets/images/draw_bg4.webp create mode 100644 lib/components/project/items/gallery/gallery_card_item.dart diff --git a/assets/iconfont/iconfont.ttf b/assets/iconfont/iconfont.ttf index d3e85c40727208a9207bc620fa92213b05c0c3f2..542806b808ea1a54df056f5397410f86b69c8946 100644 GIT binary patch delta 654 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 A{Qv*} literal 0 HcmV?d00001 diff --git a/assets/images/base_draw.webp b/assets/images/base_draw.webp new file mode 100644 index 0000000000000000000000000000000000000000..ad0f866683e0293cc90a4570a5e1315027a59415 GIT binary patch literal 3566 zcmV@St!5~ z31e>Ls23Q08K(ad#D3LyAL&2Bem48zT3^2YK={_fTevzG(2x6%TmPs%8$EFPa`T1z zh3aeO-{}wOGpS|!m*~x_SM@#G{R?L_#!eThM-*u!;Vk2XFfL+@d}}Gg+d}*k_N%78 z)T>!e3+m#HB%CFk7omO$Cn{^(P{*Ol=hej-eNhz!0@%K;DAGy7SKlb zF`#fr$zWlhV3?cA7;$L;UDEY>NE)0HI!RKZLWQ^e-^IgRz4Fo@3yaicZ`; z)2_%rk5d1NTZus1%d+UG%>b-H={J!Tq|v=XNzz%Z8c8@yGHa(@mM81ts#rp*_&X6A zIk`2B7i@gYp`H3ulah?FXkTF;NH#VsF_0B{DH{;!Y_{{ZID%qY@f zb0G|jR#4qh8SRTl(R_1hH`~iw7%-ufHzaaA%fVzHK9OMKxafe*{H*roxjR-3k~can z+FoMO28KG4!-+7yKt`tG0dlWyY588*r=GszLcot>-mpwBkPpc|cE=D*P6cRTZYX}F z?IA)nqyBIP? zjMJHY&2}I^)v`Dftdqx{&7I|RstWjunQ&Q5P}K5Iroa}NAl(NBLVC)LnBMw||a>6)#C zt$sIKSJsZ57oheOq-VC9mtc|wuAsnqcoJJ5gV!u}Y~tQ-LLh4QG>1N? z0!t0Z!x;b|;bNQUiHh#ocZ2=f4%BNhI4~hJDMN zxuPJ@&?}7qr}QQMysG7+IS$e<8#ETh@%hT^QQqi%@Y?8e>f#cYk=L}V{D=&i(7y!& zbMMt8`B!fh>8WmLPAJkrQm^CwHa_adF8kGml>Mm4ZG$a(IPHuQzsRb`0#Q;q!H&TP zygcK&#+AvwlsknB*3)n*H|kc}J{ z`%4~8o>E;0a#rDDSbU+B~Mp0FPDVjTW`d%R{&ii|G+9)UG2mmj~C)FF@ zdWUNqI%xI4n#+Twx`AuS1HQbi-BnM_bn@N=@4o1fkH(uAGt5rNa?GE4;1=nqnUTU5 z1~HBv!7(m}%CPFbx;Ov;?;;v+^d=xQc6ABp!(Eox0-272;ve`_GeF$rDSC|J%6KqI zfKvwkumAvn`*;*sgt9v9vo?x-PCK(E4p*|RQO_BuvPA%Y5FcQGM`L*0#_|BElG(7$ zFD;!?ey)edRC6c}3 z79lJ2UaG7QJtInJfC2J4K47SR{R;e{++_Ah~7MK?r`EnrQ z4q*}sV_DJ4j@$su0J`zBG>t=RNFd5hz3HVsaehP8L=4cT*_;xJxha%qTrk#KQIWT; zvuxZQZm<;vge;SM=TOhl+6Ogy$c=JC1wrS9L5b%Y9dUS6S_y@{zx{2M)Nk7F8t0m2 zbH54rBdOlwht(TTMA>)$K5y>lfkixhl|YatHy4Pt9>^mJCg+Vk4QO%7NUYU#?}YZ0GK}F;|?m zg$g6P$FTrA3+waCD$?=2o_@zOp};GiFYqr#&cYE4dyGH#gC{U{QS{4$<*#H~EhAVM z>2T;qyc;5qsneG`AYCt$nXn6*8PU*)%>Lsc!Z-JMzVxtP7V6(+6^BarysrcZU5DC* z;k-rBL`qO%mkhKReJ!)@{iu)4D`?yiWki4NteNx2A$4b_ACsi$iAPmhP)HL-6q&YM3r7|gWz91t9=1DhWdOgx}We)pkWyzu0u-qR&cxh{d= zFwvW=D6b68wF=_Z2rOQrX4siH*Oa0cXkkU@LxePKsDPOOuq%!U){JZE-vh^4`Gj*H z4YD9j3PA<=9o&?ZLnR29o;BucJ*M@44CuK@ZH6dX4l)$rO<=XH+bv3QilvF@M_B|Ngj??cg45QSf;oL^feKdURaPYb?bk?uO0Y)<&tR1R(}<+ zDbhu?$-ZrM_dZm;9Ke(KctD@u1@d>jiYgqNqkl`j?jbbGNGlK?2h=*LGC>N_ILZ}9 zP;=l+Ko1(H6^E1~BHRZSN}(@GTQE=0*d6)>S1Q7{X24fTn)~^EfuRHx8&!zaRH}Bx zmTSPa_ag*3;bpoc;m*17{61>brI>3$UwMqM>fw85XdD~W2rJZ1mcdb~rBv=yG}SM_ zk)c}OD*V@-$~oxn=3w8VTC^Sq)>;mgke?hLm|8!N;ZiU{*WNf+ ztFClDi+tk&&;T7DtA$w9_uJZkq{r&yLVG&hp-!da9heb%JY&I!xE2l+0Be&Ah15(2 z3h6gcLD~WsoG=qK8+uwqs=i8Y4_o2&E%)jm4JvgMk(FZqLJep^mvRZdkBp|ifp#0H z@|BmWVh*o9@)L4agj>oHc5U`jk1xJdl(@S=t?V|EE}T;eZg_7N(M28&-3@jmsN&bm z`Nm%$)3}NQX*(D^fFr?8v8REvUR)*hk z_is?|Cs)yfTDyXg>}SoNW0qILl;;-C0KGVMnX!qGc8Vm6HoXfTGyHx}hduK~K1|Xe zxrB;1J3cEK0^QA$mZ%JMNHj@M+W573lQI6{Uy7No7+>#CFK*=r8mq1XBcj{ zB=&U+PZ*`{;^;W|IZa0F@w_`pIXu835uyc)Lc-^C>R$5n<~~B)CjBmKDN#%uO5K;C zv00a)u>8OP)**Y(Ryk}Ef->|YuJRYJHT=})MEe`wz1&;PUH@eTf5GZk;%Tf46EJND zCd~!m7r=o>0E5`Q2&oXGr^IiyzzDWe*uek(6GJoTkQBOHMZfDhaq5^p8n-n?B`Tm9#B2Dq>s`9LR`#P44f z*|g8-c_=MWny7_09v-GM<}1?N7!oxm@1@a<41}pMz9%24;-F(}?V;fpZXq~6ZZQ*Y z3mHDCF-eThczM_Yx8wZNl}uLB(33Oa8B<6lRdb8z(HK)*|7ZHrNo*Q#9GxW`;Sckh zwsSMuzW=#KCIjvm#2~=LSGMg^bRU`$3Hr-BAa$;GcB=Q%OWFVVm?R7Jy-e5{Rg1K; z+wIzaHY0MYCZ1j8YE6QfyF;s%7hv02vQd?pllX$HB3ZRA-Q04pk#z$4#Ic+35Dcy| z4k-gKR#g#NAZp-vkYslR#$aA$kf|E}V&DwCh1Y&J{dq!&Gm{LkKyfld1$=FRrU0=L znhj|LC@vm-NU&qhJQm33(tSDMc4#kGtRr}48p}k#TeJ?Kt$D;>+=!V8=a8=3HTU2l zHUG4`6WEcTZnh_)6-Ft>OgUbKYo{h~FTBG==5kK}! z2+dHjL%AlP9c?#015R3~8EBZFyHbFNXJHu5oU`($nUO>q?&@W;JV1tqITcWhk*x#} zy``i;0H>xUY^=!Bw5WB+aPG~>W=P~Fh8*JkmnmK?BCUw35eAfHdz zzg5ue+ggA7BJ}fiT4HVwg%|{$f+`W=gZ@XI#Vs!_BL@au?ZQrV39n5l2{w&gSEu=6 zrY|52msTc7n&}fA^*_WS;wkq1&}~zSfY@8&>35IA#9!Nvbqx(>BG}k5j0s0WO*b}E zzf31Y=5Q%6+tw7?N7XEg=wEjLC=3v5!qBkUH$IcN!Z{+8r;R>e7j)RL#2%Y>$$` zNpSDL2`Bd*s2o9OeGrj=-3RcjnpwRULpu{C3`A($Ba`OenzZbuKzQASt*ZDXB`ss5 z1_M9QIm+YJD~plh9ey?04jgx{aB|CGmuV5~O&Zg;Bs%AR?`Y=C9a+=VxYS5ambS7Q zL=c6S<+(TqsNWOZDr~ST8TEVkN2cN{A#^6gwwjjuVr|=+@feYCAR|kcI0h=dtnZ^j z`hGOR$K=_4^U+dHS1*wQ7Z%gv{Jnbg42RXV-O9hoFT?+JQd~ zvS#DyT$FU?ohm@yG07@l>yvRc$h+x8<~~;JJ~Z${O-(o)gt;bhZ33JLGnS?A`?NXR zu2SOM(ODNAyAA9XVv(0lTp>$q;|D#KYDoac-Vw-`Ru{CU*tR`vffIu`jZ2-Iun{Xw zkH&SwHAduBWV|r01qj! z_$EX-XRGVb+66Jnf;wAbKX3P_3^`?~b=_q&XP7_oW~UzCDS-g!ugRiic)wcLGRY>_BGpIFjx}!6=xLO&0T%LxbM-=xYUB5 zK;~1jIsjyo;%LLm@$X3I2T8ie>i+Pq@sefE27W_ibO62Mx-JZpE|n%zp;##?7EH6I zi^WYVp+3F*xXGDJT;o$=8a_VCumWW}8ofa%Qxv{rKF)p)_?A7Eff&oh7yP>;F^!K< zmn@7ua9zv+F)=du)Yd76LlPDKd%N z4f}9%W&VaZwwdC?0{sVF-ey-UY{tDW#xDL_fRL$Ii>=FM{AvG*B3jCXE#oNA3*K{i z{X&UyAhNmVk+$^r4&BLR>c)q|Yz0*HDssL2Gf@7$EUT7=$|%h_^43d-7(_IxlwSeY~ z!*ev+y<-rrneo6xJS&(2nM6vxg8jbY>S!MMpl3XvLZg+Jb>+Off863Neppehk#Bin zGk18mA8o;@%Kr{sA>oS{gZBI~O1C`imwjTiXB&o`G*m0m z_8{U9MCb_=B}T#sOKXKXTtv)c0ta=8Vvf+J%FczTf$P-C3IKtN5UN81`tb#@IZlU9w1QwHuf zw-V-Sv=Dn3m9^&l5Fj{UpNd^6M_e#temU-LLxCP;{Ot~Ypi3ga|MC{vk9mS9wWNxt|35|+KtJ3+dJ>XED}3p#C(R97ThAAHr;0G*ZqD4gng zCt$vz#N48YbC+!8U={2NxEUPh#lDkAS`?IxPm06NtwH)s#9dolt zgHqT-=p87eRP@b`;mM?ZV4OQ#00yL>?IY?v%dC7YYMI8aWqqx`5u-X)3YiTO#Hte> zp7?jA*Q_CAs!=Rbl5o2$tuPu$e}c}&K^QL8cOw;#A~0wJqN^w%*)1s8U+(61n_zm>6N~C5u3bgCfq|S}rvystw4lf~>vYN;=O{Qw;Le@V*NU?nF&@ zg=WR3z1#U%Z|ve~%4Gy}tHfTlm@q!rNaj>hGc5 z5l0WDIi!a8(zM5ya)uY9u6{N!jJF~n>DNH=S-Bs>f#HZUs1rHbAf>hOwqvfG8B z9@D6%NHJublAP%8lp_>ruF^hy&T>qeB%Gpb_!eyx2X-vfW4z_8yoXMW(`Sv)e1FvN zHA8knsW2DgS2^C9Xn-P~;rHoW46TlO`P!#wQ*Nf*ll!XL8@AP2l6Z0$3grqDU z_^k(`B)90SNM>Doh~nI7V2%-HU4UrSynxXUM$oA3iHoIDz25M&U=g-2nJzu!#A&|& zFOjhraz+f@lt$m=mILU2!$UL;do2i#+6;2I(>5JubIgG>4mNGlnLzQ-|6WEcUWH`y zYjyBnGFcirI3G4F#QPNGXe#xn?-{deKFDRt%8w?WtpX}|whN7=8hw{8Sg|kiQ{Ki* zCZ4vZSpCyGXhXh<{GUbs0mM&Tvh@I~^&{7sFf?ukDD--RWA|87%@UPDu1iGCs;!u}&7d;*Mun6UAiE7K4b>wL-di0CBeZXMmb`~8u z1OxQ@Kj<46Wy+)&6|a`JX*Ppt`y*}|Lp`%XoS}@dpXqYq!V819JY{y}+$cya<(g@8 zBZ5bGrFk-oSmfVZz-)ONsr}eeGgQqrUi$-cbG+5=-N0s#%<;3z*PO$I==1H*Ts;lS zwXKOZi5&j_Y5Ofyo_T~RI9o&T!GuX2W@JhvG`|mfz#cz9lq{b0Rn|%mYmpMsC;qCh z#|uayHQE=daYP)*ltgSyoNppd?Fp(P#R4lES0CPrt0wRZ-BgZ8GOoJNjg#;goZOh7 zNoqS{7Bh)7***uNf!))wIrLRbL6fr=G@O!`1IpmxF&Hg?wFs^-It?k_$f^H*gl-#g9y@#m z{wRIS8=NTN*9YDf31asZ^EDY5B%7Jr8~UB&EX4F$U6)-*gL_k)K*0VQV#E`n11T<{ zZYRWQYKQ|m=fJ{9rO}QS5Erz}=*9J$;qZX`^nGyu_qLvrreTsr5=^YttvF9J5<_9~ zjf3Zu(Yliu2_!F@WEK2Fspf?1T@YoM6DwVN%6J+5m-)GckH_|8O;+!Uz7XJ-gf;Z& zt@4c{Sl-QSGSGxuPted$07o3?Fa!truM$3FREfR zZy|U~W@=3Iu!HfVL211Buo%B3wm|GyB+`uc_#ymlw`)gXVh)7}FG!_8LTE4VLPj7_ z4}RjU_NA0NuMw_<#~paSQIyTteXC4S^Q)y3`Fnn2dN0%2ij1<7qwV4WQSO3TZoeWf znKig6?Vuo<3B7RjgVQa7Q3$6XEJ$(SxR=$fpyu4ve9dnu)=>U*s$`U{*Sk*$X}1~$ zTzRhCkzm3*53bz7C)OZ+wwAMc#K#^;Jp8;(|GFsK3%QdN9WlheW^f?@Fwr4QQIkLf zik~!B&icC%4_wbis#5{Bxci`Yg{M@m#_wB^%Tu<$Ok3CDtr6*Dxaks+{Ym7PTCG|u zz=uFbB>qfVH6IWu#LED=Q;m|bBiu-IJt29|GorXWeLQ!y`$n-ir95h|2cUQ`i5`xS z-uO;S!`+-qXv%FYY+K~m^_z{Ar4$zlVnI53Y%UUP0rSsg$ zv~1L-Y`RFu&*IZlHf?@q8RRJDg1b)kee~!^r0T6q-4G}8wDlt+(SxH~iUr$u&N@G^ z5#V}^v`l2tt-Uh=x=XZWSTIO1cDhhvucVa2HW|kV=wsN5K`g$e zPp@Wy{xF~gDOno}HxygUT4KWDM%I{ig6LgZmv5=Qh|@YTSyBB5c5zYrTg`O^_ipYjD!x#imLHaq(EZsuX%q#sNQJp zfNg1Fe0<4R8;jnTR%Eh^u*S-dQTf}l3^3-&qypcS((5)#lm>)11w`i9$B%n+s9l+b z$s^VUpLy8ONHQ}nsRpKkTYHV&)3^np2AG4sv-yv+#Q?%aZFH+nK!Dz*R)dPr{KBQ* zm6R@;S%cp%x5o!I^z7OAi`D5BHii%zMRJ>jdRXH{-Tf3rRL>N&fh557tsS#sU0fD* z4%13-p&D8C31o<$xf7c*s?6h7yLi(=IdWQ(>?Yo}m1zy>uH|HtO&@AB-3`<2EMgh@ znR#Fq2Drp5oUX%7Au}HSYt_M2In%M?!u&JC?~D^0hO&SwhPu`gs`W!6-K_=4iDA54 z<2Z3MHIbIdDbS4c;4N^hzVVAhuD>O`wwJ--$nK*j2y7`-sL1ov9(IK(`gTPrRS+|I z>nqWh^wE-{QWmQ z0T1wd`mD0!ngMae9!$enN}DXAw-az?tj~ngf}=t}>D3X)p7P-}R4EsaR~wpq6ErWW zOnOtLZW2_R5alNDXubC4_Q}~n`Ca4zWa(Ov04CM8%lwrP{2MBAm{s$MBva;2pDXgF ziQ2V?E%G#)>EA92l*M2UI9(S!&S`(pY@wOSlIAv@Jt`EoZsq@C0UdjI&wqu*56pX< zxvr&$m8^D4)SnPl*^v&T5*g5E`pIkuTAq6!nDvNm-Ds<8FV?am-0Sz;_uaAiYG7YV zRE5yamX~y(c+7i1$g3tCA%B5@Y-S`3ID$!mrDG-5BCRdtzT2B0TGWfmbke#}7CXOw z8)$v$Ljd2z;{+tlkO&QDN?#IYJjRNVxg3BKa7aEgqT?PCB3p5zFb-D6gD3`gHB}^) zi<(*ivUjxjdtSbq-tn#j8v>nVs;vrlZL`QV^ydc({NR^~Y<64ss@mDoxh{Qd%&PD% zX3EnVbv24%_9T=9pXt=dFG+A=09f@}qzViC_(j-uw04bXfzTV7(UE$8f4j%#%TvFo z*?wEwX)A{atx=aMEP#`!-Yt&E>+4f9_4yA^$$_75V5I5N%-AB%L*$|NUs3w@>qb-; zn~By_1T3Y75k`bnUY4bmmPJ$f!l&I)a+rK{*)&T#UD+^q!4zR~GPiXs`O_9em}t#Q zQ7fjePQQ&J*F#B=qmVhk#K+>M$gjeJ&gIyB3p^1M4{Br#Rb8JUD(7#rs(dqV+&~$l z9z`6d+~5$w%2cEhhV=#F`h?a0#Y$%i3@DRVRNd*~8{F#+QqzU;>fTwHVhIH|(uY&# zM}~-BM#;1r5AOCY-vrHai_p1^RXDcF;N~O$f<9awujqKfJVubztA!wAGMcFMwpgwF z0VcvxC}Pm1>W{|}b-sXY8H!6DaF>194gRc}Z=XN_9Z`VQp>aGw#L$LB+Z=jxg_a<% zh>B(2J%iy3}BDmxCj7hOnn}yNk=i_{%b$!iIevqi*j;u!QT}9RrrBV?pf(6i#Q0kPP@yR z@Ud;WL@GV9!VjF99FrF{eBv``lnq>MNUFS!+`}wEI>a!UiN_&&VwqpmNw+Y%r z`DyfPI3JHw75S$FaF?4LW;^kM%f4SrH(R9hZ;OPP0i=&$gX5EZirC{+Ik+|W`6Cmi zeVh{A)Lu{>S@pyb;vFTur?l=M`zCPasNt3G3-}GKnvJ6%vin9Eq#m`EeQ8O?fhFQj zKQ%iw519dg7m)M?k{94CC_BU}y4!nO;--IUHg%62qJY8jFG3!&+^^GmuXA9CjgAgD zg6e)pOawyh`0^{ax+!7@mlm_*`YQ+Rnj|2h*8CB&`j^daMr);ZX<+Z|r3sV$RBN4b zAU(jCVE?d@L-Q%l*KEdiWAZQU5@5WfDS|_?8Hl~iFQ0QyOixsRoShSc*!=2iUc;R4 z;=Lt_u?pyvA{VCGoQeexDVi}}<>h8NW_FCUW(e@-cI0~g=;Do1HYcuF>2b!F9e?6K z=ik(D+xct*fK|)}%QD~)(5DhC>vkX>+p@7X zYV}pBO#v%9`@rw6v7uq4N0+yX6A(OjS4kt|(<dBq9 z1P{M&CHF?L0s)y@trmTV+t3$8I%g7gw9edbfYhxFY>Fdea?F}GveI8Pr)8^I@~ocd qJ|fY6vqGJ3)oHwaG@O%8hr=jfhDUsH>BX*k)LZ1Xu=@r-0001g>gyE% literal 0 HcmV?d00001 diff --git a/assets/images/draw_bg4.webp b/assets/images/draw_bg4.webp new file mode 100644 index 0000000000000000000000000000000000000000..835d03f54acf6fa07913d487e57538ccdb6c6f01 GIT binary patch literal 9494 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 literal 0 HcmV?d00001 diff --git a/lib/app/res/size_unit.dart b/lib/app/res/size_unit.dart index 7749f33..4702ad5 100644 --- a/lib/app/res/size_unit.dart +++ b/lib/app/res/size_unit.dart @@ -23,4 +23,14 @@ class SizeUnit { // 大文字大小 static const double big_text_size = 22; + + //底栏图标大小 + static const double default_bottom_nav_icon = 24; + static const double active_bottom_nav_icon = 29; + + //底栏高 + static const double bottom_nav_height = 50; + static const double bottom_nav_right_width = 120; + + } diff --git a/lib/app/res/toly_icon.dart b/lib/app/res/toly_icon.dart index e0c79aa..f16b255 100644 --- a/lib/app/res/toly_icon.dart +++ b/lib/app/res/toly_icon.dart @@ -4,8 +4,8 @@ import 'package:flutter/widgets.dart'; class TolyIcon { TolyIcon._(); +static const IconData dingzhi1 = const IconData( 0xe60e, fontFamily: "TolyIcon"); static const IconData icon_collect = const IconData( 0xe672, fontFamily: "TolyIcon"); -static const IconData kujialeqiyezhan_tiaosepan = const IconData( 0xe650, fontFamily: "TolyIcon"); static const IconData yonghu = const IconData( 0xe619, fontFamily: "TolyIcon"); static const IconData icon_common = const IconData( 0xe634, fontFamily: "TolyIcon"); static const IconData icon_see = const IconData( 0xe608, fontFamily: "TolyIcon"); diff --git a/lib/components/permanent/feedback_widget.dart b/lib/components/permanent/feedback_widget.dart index 9141116..b523e5e 100644 --- a/lib/components/permanent/feedback_widget.dart +++ b/lib/components/permanent/feedback_widget.dart @@ -61,6 +61,7 @@ class _FeedBackState extends State @override Widget build(BuildContext context) { return GestureDetector( + behavior: HitTestBehavior.opaque, onLongPress: widget.onLongPressed, onTap: () { _controller.forward(); diff --git a/lib/components/project/items/gallery/gallery_card_item.dart b/lib/components/project/items/gallery/gallery_card_item.dart new file mode 100644 index 0000000..dcade2a --- /dev/null +++ b/lib/components/project/items/gallery/gallery_card_item.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/11/28 +/// contact me by email 1981462002@qq.com +/// 说明: + +class GalleryCardItem extends StatelessWidget { + final GalleryInfo galleryInfo; + + GalleryCardItem({Key key, this.galleryInfo}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + shape: RoundedRectangleBorder( + // side: BorderSide(width: 1.0, color: Colors.black), + borderRadius: BorderRadius.all(Radius.circular(20))), + child: Container( + height: double.maxFinite, + alignment: Alignment.topCenter, + child: Column( + children: [ + Container( + height: 160, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage(galleryInfo.image)), + color: Colors.green, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + )) + // color: Colors.green, + + ), + Align( + alignment: Alignment.topLeft, + child: Padding( + padding: const EdgeInsets.only(left: 15, top: 15), + child: Wrap( + children: [ + Text( + galleryInfo.name, + style: TextStyle(fontSize: 20), + ) + ], + ), + ), + ) + ], + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all( + Radius.circular(20), + ))), + ); + } +} + +class GalleryInfo { + final int count; + final String name; + final String info; + final String image; + final String router; + + const GalleryInfo( + {this.count = 0, this.name, this.info, this.image, this.router}); + + factory GalleryInfo.fromJson(Map map) { + return GalleryInfo( + count: map['count'] ?? 0, + name: map["name"] ?? "", + image: map["image"] ?? "assets/images/draw_bg4.webp", + router: map["router"] ?? "", + info: map["info"] ?? ""); + } +} diff --git a/lib/views/pages/app/navigation/unit_bottom_bar.dart b/lib/views/pages/app/navigation/unit_bottom_bar.dart index 9929197..365e77d 100644 --- a/lib/views/pages/app/navigation/unit_bottom_bar.dart +++ b/lib/views/pages/app/navigation/unit_bottom_bar.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_unit/app/res/size_unit.dart'; import 'package:flutter_unit/app/res/toly_icon.dart'; import 'package:flutter_unit/components/permanent/feedback_widget.dart'; @@ -8,12 +9,10 @@ import 'package:flutter_unit/components/permanent/feedback_widget.dart'; class UnitBottomBar extends StatefulWidget { final Color color; - final Map itemData; final Function(int) onItemClick; UnitBottomBar( {this.color = Colors.blue, - @required this.itemData, @required this.onItemClick}); @override @@ -25,6 +24,16 @@ class _UnitBottomBarState extends State { final NotchedShape shape = const CircularNotchedRectangle(); + final borderTR = const BorderRadius.only( + topRight: Radius.circular(10), + ); + + final borderTL = const BorderRadius.only(topLeft: Radius.circular(10)); + final paddingTR = const EdgeInsets.only(top: 2, right: 2); + final paddingTL = const EdgeInsets.only(top: 2, left: 2); + final paddingL = const EdgeInsets.only(left: 8); + final paddingR = const EdgeInsets.only(right: 8); + @override Widget build(BuildContext context) { return BottomAppBar( @@ -36,117 +45,117 @@ class _UnitBottomBarState extends State { data: IconTheme.of(context).copyWith(color: Colors.white, size: 25), child: Stack( children: [ - Material( - elevation: 0, - shape: RoundedRectangleBorder(borderRadius: borderTR), - child: Container( - margin: paddingTR, - alignment: Alignment.center, - decoration: BoxDecoration( - color: widget.color.withAlpha(88), - borderRadius: borderTR), - height: 50, - width: 120, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FeedbackWidget( - onPressed: () => _updateIndex(0), - onLongPressed: () => _onLongPress(context, 0), - child: Container( - width: 50, - height: 50, - child: Icon( - TolyIcon.icon_layout, - size: _position == 0 ? 28 : 25, - color: - _position == 0 ? widget.color : Colors.white, - )), - ), - FeedbackWidget( - onPressed: () => _updateIndex(1), - child: Container( - width: 50, - height: 50, - child: Icon( - TolyIcon.kujialeqiyezhan_tiaosepan, - size: _position == 1 ? 28 : 25, - color: - _position == 1 ? widget.color : Colors.white, - )), - ), - ], - ), - ), - ), + _buildLeftBtn(context), Positioned( right: 0, - child: Material( - elevation: 0, - shape: RoundedRectangleBorder(borderRadius: borderTL), - child: Container( - margin: paddingTL, - alignment: Alignment.center, - decoration: BoxDecoration( - color: widget.color.withAlpha(88), - borderRadius: borderTL), - height: 50, - width: 120, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FeedbackWidget( - onPressed: () => _updateIndex(2), - child: Container( - width: 50, - height: 50, - child: Icon( - TolyIcon.icon_collect, - size: _position == 2 ? 28 : 25, - color: _position == 2 - ? widget.color - : Colors.white, - )), - ), - FeedbackWidget( - onPressed: () => _updateIndex(3), - onLongPressed: () => _onLongPress(context, 1), - child: Container( - width: 50, - height: 50, - child: Icon( - TolyIcon.yonghu, - size: _position == 3 ? 28 : 25, - color: _position == 3 - ? widget.color - : Colors.white, - )), - ), - ], - ), - ), - ), + child: _buildRightBtn(context), ), ], ), )); } + Widget _buildLeftBtn(BuildContext context) => Material( + shape: RoundedRectangleBorder(borderRadius: borderTR), + child: Container( + margin: paddingTR, + alignment: Alignment.center, + decoration: BoxDecoration( + color: widget.color.withAlpha(88), borderRadius: borderTR), + height: SizeUnit.bottom_nav_height, + width: SizeUnit.bottom_nav_right_width, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: FeedbackWidget( + onPressed: () => _updateIndex(0), + onLongPressed: () => _onLongPress(context, 0), + child: Container( + padding: paddingL, + height: SizeUnit.bottom_nav_height, + child: Icon( + TolyIcon.icon_layout, + size: iconSize(0), + color: iconColor(0), + )), + ), + ), + Expanded( + child: FeedbackWidget( + onPressed: () => _updateIndex(1), + child: Container( + height: SizeUnit.bottom_nav_height, + padding: paddingR, + child: Icon( + TolyIcon.dingzhi1, + size: iconSize(1), + color: iconColor(1), + )), + ), + ), + ], + ), + ), + ); + + Widget _buildRightBtn(BuildContext context) => Material( + shape: RoundedRectangleBorder(borderRadius: borderTL), + child: Container( + margin: paddingTL, + alignment: Alignment.center, + decoration: BoxDecoration( + color: widget.color.withAlpha(88), borderRadius: borderTL), + height: SizeUnit.bottom_nav_height, + width: SizeUnit.bottom_nav_right_width, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: FeedbackWidget( + onPressed: () => _updateIndex(2), + child: Container( + padding: paddingL, + height: SizeUnit.bottom_nav_height, + child: Icon( + TolyIcon.icon_collect, + size: iconSize(2), + color: iconColor(2), + )), + ), + ), + Expanded( + child: FeedbackWidget( + onPressed: () => _updateIndex(3), + onLongPressed: () => _onLongPress(context, 1), + child: Container( + padding: paddingR, + height: SizeUnit.bottom_nav_height, + child: Icon( + TolyIcon.yonghu, + size: iconSize(3), + color: iconColor(3), + )), + ), + ), + ], + ), + ), + ); + + double iconSize(int position) => _position == position + ? SizeUnit.active_bottom_nav_icon + : SizeUnit.default_bottom_nav_icon; + + Color iconColor(int position) => + _position == position ? widget.color : Colors.white; + void _updateIndex(int index) { setState(() { _position = index; widget.onItemClick(_position); }); } - - List get info => widget.itemData.keys.toList(); - - final borderTR = const BorderRadius.only( - topRight: Radius.circular(10), - ); - final borderTL = const BorderRadius.only(topLeft: Radius.circular(10)); - final paddingTR = const EdgeInsets.only(top: 2, right: 2); - final paddingTL = const EdgeInsets.only(top: 2, left: 2); } _onLongPress(BuildContext context, int i) { diff --git a/lib/views/pages/app/navigation/unit_navigation.dart b/lib/views/pages/app/navigation/unit_navigation.dart index dbc2538..afd32a6 100644 --- a/lib/views/pages/app/navigation/unit_navigation.dart +++ b/lib/views/pages/app/navigation/unit_navigation.dart @@ -1,13 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/res/cons.dart'; import 'package:flutter_unit/app/unit_router.dart'; import 'package:flutter_unit/blocs/bloc_exp.dart'; import 'package:flutter_unit/components/permanent/overlay_tool_wrapper.dart'; import 'package:flutter_unit/views/pages/app/navigation/unit_bottom_bar.dart'; import 'package:flutter_unit/views/pages/category/collect_page.dart'; import 'package:flutter_unit/views/pages/category/home_right_drawer.dart'; -import 'package:flutter_unit/views/pages/gallery/gallery_page.dart'; import 'package:flutter_unit/views/pages/gallery/gallery_unit.dart'; import 'package:flutter_unit/views/pages/me/me_page.dart'; import 'package:flutter_unit/views/pages/widget_home/home_drawer.dart'; @@ -85,12 +83,10 @@ class _UnitNavigationState extends State { BlocBuilder( builder: (_, state) => UnitBottomBar( color: state.color, - itemData: Cons.ICONS_MAP, onItemClick: _onTapBottomNav)); // 点击底部按钮事件,切换页面 _onTapBottomNav(int index) { - print('----_onTapBottomNav-----'); _controller.animateToPage(index, duration: const Duration(milliseconds: 200), curve: Curves.linear); if (index == 2) { diff --git a/lib/views/pages/gallery/gallery_unit.dart b/lib/views/pages/gallery/gallery_unit.dart index 0e871d4..ebb7440 100644 --- a/lib/views/pages/gallery/gallery_unit.dart +++ b/lib/views/pages/gallery/gallery_unit.dart @@ -1,5 +1,10 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/res/toly_icon.dart'; +import 'package:flutter_unit/blocs/bloc_exp.dart'; +import 'package:flutter_unit/components/project/items/gallery/gallery_card_item.dart'; /// create by 张风捷特烈 on 2020/11/28 /// contact me by email 1981462002@qq.com @@ -22,16 +27,15 @@ class _GalleryUnitState extends State { void initState() { super.initState(); _position = _position + _firstOffset; - factor.value = ((_position - _firstOffset + 1) % 5) / 5 == 0 - ? 1 - : ((_position - _firstOffset + 1) % 5) / 5; + + double value = ((_position - _firstOffset + 1) % 5) / 5; + factor.value = value == 0 ? 1 : value; _ctrl = PageController( viewportFraction: 0.9, initialPage: _position, )..addListener(() { - factor.value = ((_position - _firstOffset + 1) % 5) / 5 == 0 - ? 1 - : ((_position - _firstOffset + 1) % 5) / 5; + double value = ((_position - _firstOffset + 1) % 5) / 5; + factor.value = value == 0 ? 1 : value; }); } @@ -41,9 +45,9 @@ class _GalleryUnitState extends State { _ctrl.dispose(); } - Color get color => Colors.red; + Color get color => BlocProvider.of(context).state.color; - Color get nextColor => Colors.blue; + Color get nextColor => BlocProvider.of(context).state.nextColor; @override Widget build(BuildContext context) { @@ -76,65 +80,59 @@ class _GalleryUnitState extends State { ); } + final jsonStr = """ +[ + { + "image":"assets/images/anim_draw.webp", + "name":"基础绘制" + }, + { + "image":"assets/images/draw_bg3.webp", + "name":"动画绘制" + }, + { + "image":"assets/images/base_draw.webp", + "name":"手势绘制" + }, + { + "image":"assets/images/draw_bg4.webp", + "name":"趣味绘制" + }, + { + "image":"assets/images/caver.webp", + "name":"艺术画廊" + } +] +"""; + Widget _buildTitle(BuildContext context) { return Container( - alignment: Alignment.center, + alignment: Alignment(0, 0.3), height: MediaQuery.of(context).size.height * 0.25, child: Row( mainAxisSize: MainAxisSize.min, children: [ - Icon( - TolyIcon.kujialeqiyezhan_tiaosepan, - color: Colors.white, - size: 45, + FlutterLogo( + size: 40, ), SizedBox( - width: 20, + width: 10, ), Text( "绘制集录", - style: TextStyle(fontSize: 30, color: Colors.white), + style: TextStyle(fontSize: 26, color: Colors.white), ), ], ), ); } - - final List testWidgets = [ - Container( - decoration: BoxDecoration( - color: Colors.red, - borderRadius: BorderRadius.all( - Radius.circular(20), - ))), - Container( - decoration: BoxDecoration( - color: Colors.yellow, - borderRadius: BorderRadius.all( - Radius.circular(20), - ))), - Container( - decoration: BoxDecoration( - color: Colors.blue, - borderRadius: BorderRadius.all( - Radius.circular(20), - ))), - Container( - decoration: BoxDecoration( - color: Colors.green, - borderRadius: BorderRadius.all( - Radius.circular(20), - ))), - Container( - decoration: BoxDecoration( - color: Colors.orange, - borderRadius: BorderRadius.all( - Radius.circular(20), - ))), - ]; - Widget _buildContent() { + final List widgets = (json.decode(jsonStr) as List) + .map((e) => GalleryCardItem( + galleryInfo: GalleryInfo.fromJson(e), + )) + .toList(); return Container( padding: EdgeInsets.only(bottom: 80, top: 40), @@ -161,9 +159,9 @@ class _GalleryUnitState extends State { transform: Matrix4.diagonal3Values(1.0, value, 1.0), alignment: Alignment.center, child: Padding( - padding: const EdgeInsets.all(8.0), - child: testWidgets[fixPosition( - index, _firstOffset, testWidgets.length)], + padding: const EdgeInsets.all(6.0), + child: widgets[fixPosition( + index, _firstOffset, widgets.length)], ), ), ); @@ -173,7 +171,6 @@ class _GalleryUnitState extends State { onPageChanged: (index) { setState(() => _position = index); }, - // children: children2[fixPosition(realPos, initPos, children2.length)], ), ), _buildDiver(), @@ -182,24 +179,25 @@ class _GalleryUnitState extends State { } Widget _buildDiver() => Container( - margin: EdgeInsets.only(bottom: 12, left: 48, right: 48, top: 10), - height: 2, - child: ValueListenableBuilder( - valueListenable: factor, - builder: (context, value, widget) { - return LinearProgressIndicator( - value: factor.value, - valueColor: AlwaysStoppedAnimation( - Color.lerp( - color, - nextColor, - factor.value, - ), - ), - ); - }, - ), - ); + margin: EdgeInsets.only(bottom: 12, left: 48, right: 48, top: 10), + height: 2, + child: ValueListenableBuilder( + valueListenable: factor, + builder: (context, value, widget) { + return LinearProgressIndicator( + backgroundColor: Colors.black, + value: factor.value, + valueColor: AlwaysStoppedAnimation( + Color.lerp( + color, + nextColor, + factor.value, + ), + ), + ); + }, + ), + ); int fixPosition(int realPos, int initPos, int length) { final int offset = realPos - initPos;