From bb4efdd4ae406d65f48d3fa27cfbf413ef706ba6 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 20 Sep 2023 18:48:13 +0800 Subject: [PATCH] =?UTF-8?q?[6.1.0][Opt]=E6=96=B0=E5=A2=9E=E5=B9=B3?= =?UTF-8?q?=E8=A1=8C=E9=A9=BE=E9=A9=B6=E8=AF=B7=E6=B1=82=E4=B8=AD=E5=8A=A8?= =?UTF-8?q?=E7=94=BB=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/widget/ParallelDriveView.kt | 47 +++++++++++++++++- .../main/res/layout/view_parallel_drive.xml | 12 +++++ .../drawable-xhdpi/icon_para_syn.png | Bin 2140 -> 0 bytes .../drawable-xhdpi/icon_para_syn_inner.png | Bin 0 -> 574 bytes .../drawable-xhdpi/icon_para_syn_outer.png | Bin 0 -> 1852 bytes 5 files changed, 57 insertions(+), 2 deletions(-) delete mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_para_syn.png create mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_para_syn_inner.png create mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_para_syn_outer.png diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt index 79b85ef6d7..f8168e2b70 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt @@ -60,9 +60,11 @@ class ParallelDriveView @JvmOverloads constructor( private lateinit var rootLayout: ConstraintLayout private lateinit var statusIcon: ImageView + private lateinit var statusIconOuter: ImageView private lateinit var statusTitle: TextView private var listener: ClickEventListener? = null private var animator: ObjectAnimator? = null + private var syncAnimator: ObjectAnimator? = null init { LayoutInflater.from(context).inflate(R.layout.view_parallel_drive, this, true) @@ -79,6 +81,7 @@ class ParallelDriveView @JvmOverloads constructor( private fun initView() { rootLayout = findViewById(R.id.parDriveLayout) statusIcon = findViewById(R.id.ivStatusIcon) + statusIconOuter = findViewById(R.id.ivStatusProgress) statusTitle = findViewById(R.id.tvAutopilotContent) rootLayout.setOnClickListener { when (state) { @@ -211,6 +214,8 @@ class ParallelDriveView @JvmOverloads constructor( when (state) { 0 -> { stopRotateAnimation() + stopSyncAnimation() + statusIconOuter.visibility = GONE rootLayout.isEnabled = true rootLayout.alpha = 1f statusIcon.background = @@ -222,7 +227,9 @@ class ParallelDriveView @JvmOverloads constructor( } APP_REQUESTING -> { + stopSyncAnimation() rootLayout.isEnabled = true + statusIconOuter.visibility = GONE rootLayout.alpha = 1f statusIcon.background = resources.getDrawable(R.drawable.icon_para_requesting, null) @@ -234,7 +241,9 @@ class ParallelDriveView @JvmOverloads constructor( } AD_REQUESTING -> { + stopSyncAnimation() rootLayout.isEnabled = false + statusIconOuter.visibility = GONE rootLayout.alpha = 1f statusIcon.background = resources.getDrawable(R.drawable.icon_para_requesting, null) @@ -250,15 +259,19 @@ class ParallelDriveView @JvmOverloads constructor( rootLayout.isEnabled = false rootLayout.alpha = 1f statusIcon.background = - resources.getDrawable(R.drawable.icon_para_syn, null) + resources.getDrawable(R.drawable.icon_para_syn_inner, null) statusTitle.setTextColor(Color.parseColor("#FFFFFF")) statusIcon.alpha = 1f + statusIconOuter.visibility = VISIBLE + startSyncAnimation() statusTitle.text = context.getString(R.string.parallel_drive_synchronizing) rootLayout.background = resources.getDrawable(R.drawable.bg_auto_pilot, null) } PARALLEL_DRIVING -> { stopRotateAnimation() + stopSyncAnimation() + statusIconOuter.visibility = GONE rootLayout.isEnabled = false rootLayout.alpha = 1f statusIcon.background = @@ -272,6 +285,8 @@ class ParallelDriveView @JvmOverloads constructor( FAILURE -> { stopRotateAnimation() + stopSyncAnimation() + statusIconOuter.visibility = GONE rootLayout.isEnabled = false rootLayout.alpha = 1f rootLayout.postDelayed({ @@ -287,6 +302,8 @@ class ParallelDriveView @JvmOverloads constructor( ONE_EXCEPTION -> { stopRotateAnimation() + stopSyncAnimation() + statusIconOuter.visibility = GONE rootLayout.isEnabled = false rootLayout.alpha = 1f rootLayout.postDelayed({ @@ -302,6 +319,8 @@ class ParallelDriveView @JvmOverloads constructor( TWO_EXCEPTION -> { stopRotateAnimation() + stopSyncAnimation() + statusIconOuter.visibility = GONE rootLayout.isEnabled = false rootLayout.alpha = 1f rootLayout.postDelayed({ @@ -317,7 +336,9 @@ class ParallelDriveView @JvmOverloads constructor( UNAVAILABLE -> { stopRotateAnimation() - rootLayout.isEnabled = false + stopSyncAnimation() + statusIconOuter.visibility = GONE + rootLayout.isEnabled = true rootLayout.alpha = 0.4f statusIcon.background = resources.getDrawable(R.drawable.icon_autopilot_status, null) @@ -391,6 +412,28 @@ class ParallelDriveView @JvmOverloads constructor( it.cancel() } } + statusIcon.rotation = 0f + } + + @SuppressLint("Recycle") + private fun startSyncAnimation() { + if (syncAnimator == null) { + syncAnimator = ObjectAnimator.ofFloat(statusIconOuter, "rotation", 0f, 360f).apply { + duration = 1500 + repeatMode = ValueAnimator.RESTART + repeatCount = ValueAnimator.INFINITE + interpolator = LinearInterpolator() + } + } + syncAnimator?.start() + } + + private fun stopSyncAnimation() { + syncAnimator?.let { + if (it.isRunning) { + it.cancel() + } + } } override fun onDetachedFromWindow() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_parallel_drive.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_parallel_drive.xml index e6e9048bba..ac8a28b33e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_parallel_drive.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_parallel_drive.xml @@ -16,6 +16,18 @@ app:layout_constraintTop_toTopOf="parent" android:layout_marginStart="72dp" android:layout_marginTop="56dp" + tools:background="@drawable/icon_para_syn_inner" + /> + + Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91HJ}3k1ONa40RR91H2?qr0OxrR@Bjb@#z{m$RA>e5np>=0RTYMN3YCk3 zLKUfzf>;tnT17<#NeYU@5Qze*KFB4IKKMXNFeHXPv@ya9Q4uvfkeF}}O@mDvDH1fn zARv$$6cb8mAOTCQu7 z?izb~EbpM-6W|YEH3a{Qp0-Sz6l9LY>lNTq@F5T)>X3;p>zd`}^ESq>0Cz#ojP@;k zlY)!{mVzZ9S(z$$+usAte$8hI1}?`t!A<>Ut}jv$`Zi8}1C9pG88*N&_yqhq_0GOa z%y;f1Ad}H%Bcw9^Mf(2~V(ZX7Nl&C8b0F5P1y_MMi!KA(N&BC{AHh>#J;7{8PY~=$ z&Q0W0@CEQC;6~DBGj%IzzY%-yqPxnJqzJ%`U=?szD+$DzbrQG{Wtqm*T}WW}-tX6Z<@M zSK{0EbT5&V1C(9BUF}!E47%jb0WqW&o4{oldmt>9dYNO->r z#LU!fifM^J#+Gr0X7Fs72+cZkiK zN+sp;3-gj>S@zU_fWfA_>-kpO-dE~w48H_QVlKZ%rf^C}kba%~oPme-JDH6{$2Ba9J*A!Ft#8 z6~J?96MAHVe`CE5WWp2c=>}!GQlU<{>@1mIf_rOY6ekL4|1dR+!MwV~@k;EKI)0+# zOFt{{(e<)gSsnl9L6ke9b|Tf4&BOOqYRp8Oq`ZN;8^G@;BSTvy*tnI#=Rg8%+Opod zv`07lJ%X?6=r@p=mo$p*e(|Nad8AI?DA`k!`~yi;xz zxg@vQne5%#%{%4aOhb{Okb=yYiRQ<^n?-YXlSt~a)0H~q*XVaM&vq331}nsx)Q3%EMSae%#5~z z%2&1g=y)m({`F|3qV|Wdo^H&HKaBq02Xlc^86PiJ4r8|@V{@L(+P}bBe71g|EXbTq zzmiOR#n$eSx`B=hfemT&%CeH@kxEU*3v)@PB$9YLvAbg^Ye1*6E-$JL+CCD&zjxBB z!4H7%O$eCTltWNml|#y}vTmtXX22&Xe+`UMj>Wl4t!-10RAQY_u1K-W-lc=TZZrq~ zklFHM{ix(g9J`9%25kh&BuK16=bR$=*;M-ZNfK2WYkfDQZ>BslAvTxZ`QR9k*g_)D zAy}QlRj>s93WeKR23>$rPwJ5gvAvA*--0KA8Eea0r!Mal{VG|(zkbZfEU1-b5Suez z9NE7|;n~SGrZPK;)w-&F0x4$1wd=17=@{*w>dPUf-tU56m!CUe&eCKh+Bhv&&l5;d z=`ReAqV52hjSTST%4>1pjO{nUpEv)Dz`?+nN+MoSUO!9q~YexZ$FD{xnS3tb6g%&22_wPtF(8`j3(p`|>Z076J7E&=tw!R;9T zJ9;RBPknt8c$>&%hM0c!c@I7(y_a?+#bAkfZv6(k%m>iM${GG?i7nKr3-sx#+#<{xs$fdfGT%*;ny-&U5~ z^I!vb8Zuos0{V27fk~CtA?V9K7knBV4a{KRdt|U?Vh8Y&x~0a8gA&0`NB##vhIYf2 S7sw6(0000k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TW!-bOAGh4N~~LlK%rx*$Ph=$B+!x zx6^FBjs%Fb3bP({;@(=yD7Mbw&WSfi?y2rzifx>__eKQAv}?C|TJ05@{(rQdz&%}H z*^KX8?B|*f`{t#|J+JY+=Y6?iMgu1%(vfJ~)^>m0YqOcp1>P=H{nEUzsy29O&AP{T z{y+I6Hg{|8Z$DkBtxmCzlJ=J?9hUcSJ8n{@TNU17_3ru1-5psMAL!*8I`S=1;F>n| zaPQZ}+fUaVo!6y);173|%TK}6ib_v5i2vnSV)fMTZ&0^ep@z?kzcUw9iyS+gF^8Y| z$-cg?KYTB8YRQG(TUl^$@#eD|pS}5YZ_TXrr3Wf|D`R{U8ac1jE#Ja<{gqLFUvPNdxvfsm_HAn`7VELjx~ReDx*%01W`U_mn%T5Bi5-avXNNm@t-!oHowyPAL;12*g_;^eqljx5r^dTN9SC3aESc<^W)>^ zXN^Dqon>G9?i$P61wWk5&-eY=U2`KmA@_*?i)C&a&psM33S*)O9j1DIwtHfX5%zwd Oxbt-Nb6Mw<&;$ShBju6+ literal 0 HcmV?d00001 diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_para_syn_outer.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_para_syn_outer.png new file mode 100644 index 0000000000000000000000000000000000000000..b90122c3b123a51380a8ed0b9cb224d176436f5a GIT binary patch literal 1852 zcmV-C2gCS@P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91HJ}3k1ONa40RR91H2?qr0OxrR@Bjb?rb$FWRA>e5np=ogRTRga)Cwz! z?h~nH_R#%8Qd(elD!PX~R2D@KJxF2nk`GE`FA|j%J_Lc3g%K4>H?TnIVips20c{Kg z&9t;K@seduzu%d&PJ51@-^@4jImZbX{Aca6FKey;Ui<8`zjLN#P!px2qvHt7T?)Q3NoYcIvLyx4hKO*9b`hMb>(vTdNbo+2d_cSj5aI{lY)!{rhYaU;nD^X~ASR=hjUW}{ z*V6w9h_#`6Bt0SpnITx40j7X(7CH@VJMD|Xhu~YVf?&3yy9o9q=O!{1TmUWvZX~sA zM%^2<&%)j=bY1C|6alyqybavdQUc-3Itk1M3vep2h6EqO7~n=T5sU_@?bPR|v`xoH z-HoI!DV!aJk@vv)AdJVoq2qS&7*5PgQv{z*-lM=J9^_K}9raW3>9VdVEf|?Y%h6y8 z9e;>k)SID2;0&Nq5rn*np9Ie{rfJU?>}7&)m*S)x2cd&hOzdjv9>%x#=^i2}2Piv$ zyV`TW47%j50bxij)`9ylxD>rlh0xB%fs^M1hyNhBgu2IxBjV?>Q&LhkijToc;7rvb zbS;L~(AF;ku~r;OY$OOm5tq-hx#d8DR1k{g6@x-szY$!I5efIJK+H_d0uqdvLc862 z8Yv`QuR$oC4F_89neCP;2pK7Ux1hW=eBK#TiU%M)l)6GBWzcD-^0jT=UmiXy6Ns(H z`E(HR#pJs~`#2~>Qr!`~XwJC1p~ zGg5RMOQXLYLs;F{yY%TdNyuD<)0B*{2C=N1{ZgdzPB5X=_!QT^l&@5BGUpOR znM@EVGDM%O9EaBhc}3b`Vs5Z9Quy~xk?+;-0^T$^QGW59`& zF9B7`D4e_0(w|2`Mjf$sDQBd(cXrXiuN&pT4>DW6tglLz;n-F57pO%bO@hQS6uTe6 z`{l#ePm;*enCp3vevxuzLToO*Tfqnru?2~^4ub#vASCc#8SrwALAPPlCv{~)Y@2ZY z67Ze58LO4GqAuTTyF+5A@BRZeJaE;0tdGP-@c}kY>2&lSnhH(>X~tXvI@thT!T8tcrU*Xubv5ub5tA8&^sCP|@wwM?Y0c%wph9rs zbL$acio;0|484xFkHF{koY7uW@Zr}K{|n$^;5{35gG~5cL!1AQRb+_kJ)~Pwj=-tQ z;U3_jG8~j08^Ct3GQs*5b!F4u3N??T9|Lib1-BBjNAsd!|$0ysV;mX^!Gc^!y; zp`&kHOHg=%SPCI0rpMASsjv(=cbm(AC;4F@0#++=ZJ?2bC`Wr*AN}0`eEzgS#w;}~ zy(Sf&^33@>^M~BYU