From 1cfcb3fe977610c41dafdbd61aed55c7b9feea8d Mon Sep 17 00:00:00 2001 From: YANG JIANKUAN Date: Tue, 16 Dec 2025 10:10:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20opt=20=E5=87=BA=E6=B8=AF=E8=AE=A1?= =?UTF-8?q?=E9=87=8D=20=E5=BC=80=E5=A7=8B=E8=AE=A1=E9=87=8D=20floatButton?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gjc/activity/GjcWeighingStartActivity.kt | 154 ++++++++++++++++++ .../src/main/res/drawable/bg_float_button.xml | 5 + .../ic_float_button_weighing_start.png | Bin 0 -> 1813 bytes .../layout/activity_gjc_weighing_start.xml | 64 +++++++- 4 files changed, 214 insertions(+), 9 deletions(-) create mode 100644 module_gjc/src/main/res/drawable/bg_float_button.xml create mode 100644 module_gjc/src/main/res/drawable/ic_float_button_weighing_start.png diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt index 3b8b5cf..3d8e320 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt @@ -1,8 +1,13 @@ package com.lukouguoji.gjc.activity +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.AnimatorSet +import android.animation.ObjectAnimator import android.content.Context import android.content.Intent import android.os.Bundle +import android.view.View import com.alibaba.android.arouter.facade.annotation.Route import com.lukouguoji.gjc.R import com.lukouguoji.gjc.databinding.ActivityGjcWeighingStartBinding @@ -18,6 +23,8 @@ import com.lukouguoji.module_base.router.ARouterConstants class GjcWeighingStartActivity : BaseBindingActivity() { + private var isExpanded = false + override fun layoutId() = R.layout.activity_gjc_weighing_start override fun viewModelClass() = GjcWeighingStartViewModel::class.java @@ -26,6 +33,153 @@ class GjcWeighingStartActivity : setBackArrow("开始计重") binding.viewModel = viewModel viewModel.initOnCreated(this, intent) + + setupFloatButtons() + } + + private fun setupFloatButtons() { + // 主按钮点击事件 + binding.mainFloatButton.setOnClickListener { + if (!isExpanded) { + expandButtons() + } + } + + // 遮罩层点击事件 + binding.maskView.setOnClickListener { + collapseButtons() + } + + // 子按钮1点击事件 - 跳转到出港运抵页面 + binding.subButton1.setOnClickListener { + com.alibaba.android.arouter.launcher.ARouter.getInstance() + .build(ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE) + .navigation() + collapseButtons() + } + + // 子按钮2点击事件 - 跳转到计重记录 + binding.subButton2.setOnClickListener { + com.alibaba.android.arouter.launcher.ARouter.getInstance() + .build(ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST) + .navigation() + collapseButtons() + } + } + + /** + * 展开子按钮 + */ + private fun expandButtons() { + isExpanded = true + + // 显示遮罩层 + binding.maskView.visibility = View.VISIBLE + binding.maskView.alpha = 0f + binding.maskView.animate().alpha(0.3f).setDuration(200).start() + + // 显示子按钮 + binding.subButton1.visibility = View.VISIBLE + binding.subButton2.visibility = View.VISIBLE + + // 子按钮1动画(向左上方移动: 左移15dp, 上移55dp) + val sub1TransX = ObjectAnimator.ofFloat(binding.subButton1, "translationX", 0f, -5f) + val sub1TransY = ObjectAnimator.ofFloat(binding.subButton1, "translationY", 0f, -25f) + val sub1Alpha = ObjectAnimator.ofFloat(binding.subButton1, "alpha", 0f, 1f) + val sub1Scale = ObjectAnimator.ofFloat(binding.subButton1, "scaleX", 0f, 1f) + val sub1ScaleY = ObjectAnimator.ofFloat(binding.subButton1, "scaleY", 0f, 1f) + + val animSet1 = AnimatorSet() + animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY) + animSet1.duration = 200 + + // 子按钮2动画(向左下方移动: 左移55dp, 下移15dp) + val sub2TransX = ObjectAnimator.ofFloat(binding.subButton2, "translationX", 0f, -25f) + val sub2TransY = ObjectAnimator.ofFloat(binding.subButton2, "translationY", 0f, -5f) + val sub2Alpha = ObjectAnimator.ofFloat(binding.subButton2, "alpha", 0f, 1f) + val sub2Scale = ObjectAnimator.ofFloat(binding.subButton2, "scaleX", 0f, 1f) + val sub2ScaleY = ObjectAnimator.ofFloat(binding.subButton2, "scaleY", 0f, 1f) + + val animSet2 = AnimatorSet() + animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY) + animSet2.duration = 200 + animSet2.startDelay = 50 + + // 主按钮隐藏动画 + binding.mainFloatButton.animate() + .scaleX(0f) + .scaleY(0f) + .alpha(0f) + .setDuration(150) + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + binding.mainFloatButton.visibility = View.GONE + } + }) + .start() + + animSet1.start() + animSet2.start() + } + + /** + * 收起子按钮 + */ + private fun collapseButtons() { + isExpanded = false + + // 隐藏遮罩层 + binding.maskView.animate().alpha(0f).setDuration(200).withEndAction { + binding.maskView.visibility = View.GONE + }.start() + + // 子按钮1动画(回到原位) + val sub1TransX = ObjectAnimator.ofFloat(binding.subButton1, "translationX", binding.subButton1.translationX, 0f) + val sub1TransY = ObjectAnimator.ofFloat(binding.subButton1, "translationY", binding.subButton1.translationY, 0f) + val sub1Alpha = ObjectAnimator.ofFloat(binding.subButton1, "alpha", 1f, 0f) + val sub1Scale = ObjectAnimator.ofFloat(binding.subButton1, "scaleX", 1f, 0f) + val sub1ScaleY = ObjectAnimator.ofFloat(binding.subButton1, "scaleY", 1f, 0f) + + val animSet1 = AnimatorSet() + animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY) + animSet1.duration = 200 + + // 子按钮2动画(回到原位) + val sub2TransX = ObjectAnimator.ofFloat(binding.subButton2, "translationX", binding.subButton2.translationX, 0f) + val sub2TransY = ObjectAnimator.ofFloat(binding.subButton2, "translationY", binding.subButton2.translationY, 0f) + val sub2Alpha = ObjectAnimator.ofFloat(binding.subButton2, "alpha", 1f, 0f) + val sub2Scale = ObjectAnimator.ofFloat(binding.subButton2, "scaleX", 1f, 0f) + val sub2ScaleY = ObjectAnimator.ofFloat(binding.subButton2, "scaleY", 1f, 0f) + + val animSet2 = AnimatorSet() + animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY) + animSet2.duration = 200 + + animSet1.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + binding.subButton1.visibility = View.GONE + } + }) + + animSet2.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + binding.subButton2.visibility = View.GONE + } + }) + + // 主按钮显示动画 + binding.mainFloatButton.visibility = View.VISIBLE + binding.mainFloatButton.animate() + .scaleX(1f) + .scaleY(1f) + .alpha(1f) + .setDuration(200) + .setStartDelay(100) + .setListener(null) + .start() + + animSet1.start() + animSet2.start() } companion object { diff --git a/module_gjc/src/main/res/drawable/bg_float_button.xml b/module_gjc/src/main/res/drawable/bg_float_button.xml new file mode 100644 index 0000000..d69afe7 --- /dev/null +++ b/module_gjc/src/main/res/drawable/bg_float_button.xml @@ -0,0 +1,5 @@ + + + + diff --git a/module_gjc/src/main/res/drawable/ic_float_button_weighing_start.png b/module_gjc/src/main/res/drawable/ic_float_button_weighing_start.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3b61ab369c1cd472752dd560ab658a4d6a69b8 GIT binary patch literal 1813 zcmV+w2kQ8VP)@iT22U{>O!XByz7jh|_o7~r?B-(LRs`t9@Y|NM8GVwCeyaYJpy zOj3IWAB1pd$_E&Hv6m_2blCBN+6ciiYK^7GC$GiUHtE$>vHZ!Si;&1R~n) z?Ly)o7-r&>nAvU^oPbk{Ky82;AhaYh*WbUF}$2;PKEDUYs1OwDg!{!WCdpvwgiKr1+LpinP7W%yrfM1Y|(tJ*Z`WM zbMZ!Jm0*o9ZXrsHE zsx*L`R^1GLfou&Sv-G(bwB&c|th&KsPfM+2l3>U^9A=)A!xdNe>vq0Yx?fX*A7 zqDKRy6zY7O2I#cGxwL42T%|glM+0=)*j!pPK(11q&Z7Z3ZEP+r8X#AxPUq18oi;X? z77dWARHyT3fX*7bmktfESFz6K(*T_{bT6H=8sK#))ZZUJyt}rX)8pr21B~PNXH-Fk zar}1$dq@)qpW91UJj-}u>m6AGXK9^p6>LhceOP>myEw+10c8N)`Rse0+`p# zJ6(Tjjuu#RYHsn#S+6p{UmrhwmLj19n=lLP=SQ@=z|7}4oAgzc0gyhDVAw6dycM_$ ze8TY0vVSbF1)q2B@k5 zPynJKM7XPj=r&%l1CI*SltAs`#)HRWfDc0Q4v3?;pbqLuROR!?t-1joljDEvz9R!Q zt)nMC<_55C2J`C_paFFHHD9d-Km%wM48EQQ2;M*~d>TNjVDR;32Eb3RBJdOJM+RzI z^#r*QNAf`}D?Z3u)c_C&FIPy_;9tM({@W4s9+~2rnVTNi3 z062&*V!!(#X1UhlxW7FNxJrv-ttU>{NH7C%m2z6Ht6~5FbpyC%au1(@OYn`@$$Rj~ z8rPg^nLurT35b_nzuIHj$=UDLiNFcQo^Y;m&KXb{0000ar;vj=S#J%C#0lE(y|XR* zpfUgeEE9VE47@49Fvl~8CAK|xw&hxUE;aym3KB#MA-wvy3d%|K5-iapS_^e}Wrv4+ zG1L}oY2vD>x7J}y*5b53dK6MPWq(oJubABm!Ch?XVgm@BV%N#qmPb_FTbdPf(imV1 zP`I(wm&0&`G6B;7nL>G)RvQNmP+QSp`DlP(4XX{82B@uQuzWN?u!hx!O9RwaG*~_w zAXvj{!=(XgD;g{x4G^SZRxoJ*D`kV^r2&F8$_ge8V5Mx3yfi?NMp?n60j!h_l9vVu z(kLsKG=P<|LGsc7&KqS7j|Q+-*m-^$z%s{ns5vB{YS9@P-+r0j9?R9Kwph$kG336t7K(BWdK=!i6R(w3h<@^ zyGb}*Q}aBG=W^P@sx|-ws{v#Sq;?Dq-Lq3#a?0fTx|h>hUbO*`7~+2M`PQ&k;6g)z zb5D5Xgv}e2v>8_~M_cK`qY|Np_63WWdw00v1!K~w_(;EWASLiW2v00000NkvXXu0mjf DHAgh- literal 0 HcmV?d00001 diff --git a/module_gjc/src/main/res/layout/activity_gjc_weighing_start.xml b/module_gjc/src/main/res/layout/activity_gjc_weighing_start.xml index 858e0fe..2d56ca6 100644 --- a/module_gjc/src/main/res/layout/activity_gjc_weighing_start.xml +++ b/module_gjc/src/main/res/layout/activity_gjc_weighing_start.xml @@ -11,19 +11,23 @@ type="com.lukouguoji.gjc.viewModel.GjcWeighingStartViewModel" /> - + android:background="@color/color_f2"> - - - - + android:layout_height="match_parent" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + +