From dba4cdd23f8fb4937e091ef214b37aa993fec2e1 Mon Sep 17 00:00:00 2001 From: wangyu4life Date: Wed, 28 Jan 2026 23:47:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=9F=B1=E7=8A=B6=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blzb/ui/fragment/guide/GuideViewModel.kt | 14 --- .../ui/fragment/guide/vip/GuideVipFragment.kt | 53 ++++++++- .../com/cheng/blzb/widget/BarChartView.kt | 103 ++++++++++++------ .../main/res/layout/fragment_guide_vip.xml | 3 +- app/src/main/res/layout/layout_bar_chart.xml | 28 ----- .../main/res/layout/listitem_bar_chart_x.xml | 12 +- ...ic_bar_chart.9.png => ic_bar_chart1.9.png} | Bin .../res/mipmap-xxhdpi/ic_bar_chart2.9.png | Bin 0 -> 1820 bytes ..._chart_top.webp => ic_bar_chart_top1.webp} | Bin .../res/mipmap-xxhdpi/ic_bar_chart_top2.webp | Bin 0 -> 534 bytes 10 files changed, 125 insertions(+), 88 deletions(-) delete mode 100644 app/src/main/res/layout/layout_bar_chart.xml rename app/src/main/res/mipmap-xxhdpi/{ic_bar_chart.9.png => ic_bar_chart1.9.png} (100%) create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_bar_chart2.9.png rename app/src/main/res/mipmap-xxhdpi/{ic_bar_chart_top.webp => ic_bar_chart_top1.webp} (100%) create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_bar_chart_top2.webp diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/GuideViewModel.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/GuideViewModel.kt index 1870506..e584132 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/GuideViewModel.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/GuideViewModel.kt @@ -3,7 +3,6 @@ package com.cheng.blzb.ui.fragment.guide import androidx.lifecycle.MutableLiveData import com.cheng.blzb.bean.AreaEntity import com.cheng.blzb.bean.GuideTotalBidEntity -import com.cheng.blzb.bean.GuideUpdateEntity import com.cheng.blzb.bean.HotWordEntity import com.cheng.blzb.net.ApiFactory import com.example.base.extensions.toast @@ -15,7 +14,6 @@ class GuideViewModel :BaseViewModel(){ val cityLiveData = MutableLiveData>() val userCityLiveData = MutableLiveData() val totalLiveData = MutableLiveData() - val updateLiveData = MutableLiveData>() fun getHotWordList() { launchOnUiTryCatch({ @@ -64,16 +62,4 @@ class GuideViewModel :BaseViewModel(){ L.d(it) }) } - - fun getUpdateNum() { - launchOnUiTryCatch({ - val response = ApiFactory.apiService.getUpdateNum("8") - if (response.status) { - updateLiveData.postValue(response.data) - } else toast(response.message, true) - }, { - setError(it) - L.d(it) - }) - } } \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt index 2842ae3..967fbdb 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt @@ -7,6 +7,7 @@ import android.os.Build import android.text.TextUtils import android.view.View import android.view.ViewTreeObserver.OnGlobalLayoutListener +import android.widget.TextView import android.window.OnBackInvokedDispatcher import androidx.activity.addCallback import androidx.core.animation.addListener @@ -148,6 +149,33 @@ class GuideVipFragment: BaseFragment requireActivity().startActivity() } + binding.tvTab1.onClick { + binding.layoutTotalInfo.visible() + binding.layoutChart.gone() + updateTabStyle(binding.tvTab1) + } + + binding.tvTab2.onClick { + binding.layoutTotalInfo.gone() + binding.layoutChart.visible() + updateTabStyle(binding.tvTab2) + setChartData() + } + + binding.tvTab3.onClick { + binding.layoutTotalInfo.gone() + binding.layoutChart.visible() + updateTabStyle(binding.tvTab3) + setChartData() + } + + binding.tvTab4.onClick { + binding.layoutTotalInfo.gone() + binding.layoutChart.visible() + updateTabStyle(binding.tvTab4) + setChartData() + } + binding.tvAliPay.onClick { payType = 1 checkPayType() @@ -211,7 +239,7 @@ class GuideVipFragment: BaseFragment } } - @SuppressLint("NotifyDataSetChanged") + @SuppressLint("NotifyDataSetChanged", "SetTextI18n") override fun initObserve() { super.initObserve() mViewModel.goodsListLiveData.observe(this) { list -> @@ -248,7 +276,6 @@ class GuideVipFragment: BaseFragment mViewModel.updateLiveData.observe(this) { updateInfoList.clear() updateInfoList.addAll(it) - setChartData() binding.tvChartTitle.text = "月份:${Calendar.getInstance().get(Calendar.MONTH) + 1}月 单位:条" } @@ -415,6 +442,25 @@ class GuideVipFragment: BaseFragment animSet.start() } + private fun updateTabStyle(textView: TextView) { + binding.tvTab1.setTextColor(getColor(R.color.color_9bbbdf)) + binding.tvTab2.setTextColor(getColor(R.color.color_9bbbdf)) + binding.tvTab3.setTextColor(getColor(R.color.color_9bbbdf)) + binding.tvTab4.setTextColor(getColor(R.color.color_9bbbdf)) + + binding.tvTab1.setBackgroundResource(R.mipmap.ic_guide_vip_tab_default) + binding.tvTab2.setBackgroundResource(R.mipmap.ic_guide_vip_tab_default) + binding.tvTab3.setBackgroundResource(R.mipmap.ic_guide_vip_tab_default) + binding.tvTab4.setBackgroundResource(R.mipmap.ic_guide_vip_tab_default) + + textView.setTextColor(getColor(R.color.white)) + textView.setBackgroundResource(R.mipmap.ic_guide_vip_tab_checked) + + val infoRotateAnim = ObjectAnimator.ofFloat(binding.layoutInfo, "rotationX", 90f, -10f, 10f, 0f) + infoRotateAnim.duration = 1000 + infoRotateAnim.start() + } + private fun checkPayType() { if (payType == 0) { val start1 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_wx_pay) @@ -549,7 +595,7 @@ class GuideVipFragment: BaseFragment countdownDisposable = RxCountDown.countdown(totalSeconds) .subscribe { setCountdownTime(it) - if (it == 0L) { + if (it == 0L && !isStateSaved) { val f = GuideSaleDialog.newInstance() f.setOnSelectListener { seconds -> totalSeconds = seconds @@ -561,6 +607,7 @@ class GuideVipFragment: BaseFragment } //格式化倒计时 + @SuppressLint("DefaultLocale") private fun setCountdownTime(seconds: Long) { val minutes = seconds / 60 val hours = minutes / 60 diff --git a/app/src/main/java/com/cheng/blzb/widget/BarChartView.kt b/app/src/main/java/com/cheng/blzb/widget/BarChartView.kt index 3165fb7..b93c2c9 100644 --- a/app/src/main/java/com/cheng/blzb/widget/BarChartView.kt +++ b/app/src/main/java/com/cheng/blzb/widget/BarChartView.kt @@ -5,9 +5,10 @@ import android.content.Context import android.util.AttributeSet import android.view.View import android.widget.FrameLayout -import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.animation.addListener +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.viewholder.BaseViewHolder @@ -22,32 +23,54 @@ class BarChartView @JvmOverloads constructor( attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { - private val xAxisAdapter by lazy { XAxisAdapter() } - - private val yAxisAdapter by lazy { YAxisAdapter() } - private val yAxisRowCount = 6 - private var maxValue = 0f + private var maxYAxisValue = 0f - init { - val view = inflate(context, R.layout.layout_bar_chart, null) - addView(view, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + /** + * 设置X轴数据 + */ + private fun setXAxisData(data: List, type: Int = 1) { + val rvXAxis = RecyclerView(context) + val adapter = XAxisAdapter(type) + rvXAxis.adapter = adapter + rvXAxis.layoutManager = GridLayoutManager(context, 7) + val xAxisLp = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + xAxisLp.marginStart = DensityUtils.dp2px(50f) + xAxisLp.marginEnd = DensityUtils.dp2px(20f) + rvXAxis.layoutParams = xAxisLp + addView(rvXAxis) + + adapter.setList(data) } - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec) + /** + * 设置Y轴数据 + */ + private fun setYAxisData(data: List) { + val rvYAxis = RecyclerView(context) + val adapter = YAxisAdapter() + rvYAxis.adapter = adapter + rvYAxis.layoutManager = LinearLayoutManager(context) + val yAxisLp = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + yAxisLp.bottomMargin = DensityUtils.dp2px(15f) + rvYAxis.layoutParams = yAxisLp + addView(rvYAxis) - val rvX = findViewById(R.id.rv_x) - rvX.adapter = xAxisAdapter - - val rvY = findViewById(R.id.rv_y) - rvY.adapter = yAxisAdapter + adapter.setList(data) } - fun setData(xValueList: List) { + /** + * 设置数据 + */ + fun setData(vararg xValueLists: List) { + removeAllViews() + + val allValueList = mutableListOf() + xValueLists.forEach { allValueList.addAll(it) } + val yValueList = mutableListOf() - val rowValue = xValueList.maxBy { it.value }.value / yAxisRowCount + val rowValue = allValueList.maxBy { it.value }.value / yAxisRowCount val value = if (rowValue > 10) { var bigNum = rowValue.toInt().toFloat() val numLength = rowValue.toInt().toString().length @@ -64,40 +87,52 @@ class BarChartView @JvmOverloads constructor( for (i in 0 .. yAxisRowCount) { yValueList.add(0, YAxisValue(i * value)) } - maxValue = value * yAxisRowCount + maxYAxisValue = value * yAxisRowCount - xAxisAdapter.setList(xValueList) - yAxisAdapter.setList(yValueList) + setYAxisData(yValueList) + xValueLists.forEachIndexed { index, xAxisValues -> + setXAxisData(xAxisValues, index + 1) + } } - data class XAxisValue(val value: Float, val date: String) + data class XAxisValue(val value: Float, val date: String, var anim: Boolean = true) data class YAxisValue(val value: Float) - inner class XAxisAdapter : BaseQuickAdapter(R.layout.listitem_bar_chart_x) { + inner class XAxisAdapter(val type: Int) : BaseQuickAdapter(R.layout.listitem_bar_chart_x) { override fun convert(holder: BaseViewHolder, item: XAxisValue) { - holder.setText(R.id.tv_value, "${DecimalFormat("0.#").format(item.value)}") + holder.setText(R.id.tv_value, DecimalFormat("0.#").format(item.value)) holder.setText(R.id.tv_date, item.date) + if (type == 1) { + holder.setImageResource(R.id.iv_bar, R.mipmap.ic_bar_chart1) + holder.setImageResource(R.id.iv_bar_top, R.mipmap.ic_bar_chart_top1) + } else { + holder.setImageResource(R.id.iv_bar, R.mipmap.ic_bar_chart2) + holder.setImageResource(R.id.iv_bar_top, R.mipmap.ic_bar_chart_top2) + } - val lp = holder.getView(R.id.iv_bar).layoutParams as ConstraintLayout.LayoutParams - lp.height = (item.value / maxValue * recyclerView.measuredHeight * yAxisRowCount / (yAxisRowCount + 1)).toInt() - DensityUtils.dp2px(6f) - (holder.getView(R.id.iv_bar)).layoutParams = lp -// startAnim(holder.getView(R.id.iv_bar), item) + if (item.anim) { + startAnimation(holder.getView(R.id.iv_bar), item) + item.anim = false + } else { + holder.setVisible(R.id.iv_bar, true) + } } - private fun startAnim(barView: View, item: XAxisValue) { + private fun startAnimation(barView: View, item: XAxisValue) { + val itemHeight = (item.value / maxYAxisValue * recyclerView.measuredHeight * yAxisRowCount / (yAxisRowCount + 1)).toInt() - DensityUtils.dp2px(10f) val valueAnim = ValueAnimator.ofFloat(0f, 1f) valueAnim.addUpdateListener { animator -> - val value = animator.animatedValue as Float - val itemHeight = (item.value / maxValue * recyclerView.measuredHeight * yAxisRowCount / (yAxisRowCount + 1)).toInt() - DensityUtils.dp2px(6f) val lp = barView.layoutParams as ConstraintLayout.LayoutParams - lp.height = (value * itemHeight).toInt() + val value = animator.animatedValue as Float + lp.height = (value * itemHeight).coerceAtLeast(DensityUtils.dp2px(6f).toFloat()).toInt() barView.layoutParams = lp } valueAnim.addListener(onStart = { barView.visible() }) - valueAnim.duration = 1000 + valueAnim.duration = 2000 + valueAnim.startDelay = 1000 valueAnim.start() } } @@ -109,7 +144,7 @@ class BarChartView @JvmOverloads constructor( lp.height = recyclerView.measuredHeight / (yAxisRowCount + 1) holder.itemView.layoutParams = lp - holder.setText(R.id.tv_value, "${DecimalFormat("0.#").format(item.value)}") + holder.setText(R.id.tv_value, DecimalFormat("0.#").format(item.value)) } } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_guide_vip.xml b/app/src/main/res/layout/fragment_guide_vip.xml index effbee0..b6dccfa 100644 --- a/app/src/main/res/layout/fragment_guide_vip.xml +++ b/app/src/main/res/layout/fragment_guide_vip.xml @@ -163,7 +163,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@mipmap/ic_guide_vip_info_bg" - android:visibility="gone" app:layout_constraintTop_toTopOf="parent"> - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_bar_chart_x.xml b/app/src/main/res/layout/listitem_bar_chart_x.xml index 75d3a12..f8ece8d 100644 --- a/app/src/main/res/layout/listitem_bar_chart_x.xml +++ b/app/src/main/res/layout/listitem_bar_chart_x.xml @@ -2,8 +2,7 @@ + android:layout_height="match_parent"> @@ -29,12 +29,10 @@ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_bar_chart.9.png b/app/src/main/res/mipmap-xxhdpi/ic_bar_chart1.9.png similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/ic_bar_chart.9.png rename to app/src/main/res/mipmap-xxhdpi/ic_bar_chart1.9.png diff --git a/app/src/main/res/mipmap-xxhdpi/ic_bar_chart2.9.png b/app/src/main/res/mipmap-xxhdpi/ic_bar_chart2.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9014fef4234cf13a55fbf2ca460fc64f92580496 GIT binary patch literal 1820 zcmYk7eLRzUAIGN?%RI59EJJf)4$-&DGAds3I=kk+ZY~Y8SrYK)5RH6!n_GKKZ|Cr)ue%{oU zR2xDmEyZ6jEAtJmzK{M3tiJ2QLT$*g@yKm4**QAP@UB972dO>hP|DC;;Gge>tCinp zJe_(F^7hyQ{Jy^9M$6~};UT*7toCL7im=GK&5fD6va(4R5_G@tDRL#%eog!Kix}3+ z6Y=84S}T;{QIsjTL_|-{9tRJ&u?p2l1($TezcK*$e1Lti{dG8Lqw7NABZr)4mnkP&rk>FPT_I*6cGU%F6AmnV19->+`m$Ku2CB9%H z`}KbQOnCd~NPXg|b0dK`$kogt!&zcsEFI}C|5keA&fUDP-FSQBDv??2R6BRE{-i6KZ>>eM}wpd zIu@c9b(_1K%^{#^mf`y}Cf!&`e`a0>RDZE@!P=fGC-ohcg%4R=fm$iW4EavEu#zT} zYqm;EF^Y%~-Y+s>9e_o5bJ$o_>G#XfQ;)_C)*bBh?{&>r`?9-SSy?1Xz*__4Xwr;- zTIc57j6F^m7`F`V@K+%oM@1w`DAc;;1}A{B=Z}GRCd>dkQVH#Z(q*k|v=|^JzSQ{Y zAuP&2e}_Rh_{`bJwA~t$rdV2Z|C|w4F;^DFDUAKQ&!JZ~`nf1==HXT_U)?Cf1DN5Q zr|_zK!wx16AWb0kJCNzFo+;l<1u0hSbi2;1fw@@-sm>N$xu~WT5DY)KQRvMi?X81+ zEmB02({&7v28-wHS`xdFu4{)c!W@{p$n=((G7j{qQzWbl)5J!a^nekz0C5;{TS{ZE zY$^dSVjBS+0WJapp~?kC!x=03${D?F0H3@p{-_)52nNu-61g^I1TbE`X3^CH=zq7o zD*iWAV^YGn;PWOe=tlW- zJ}O6RE8`}@f872p?nGIVU%4|YNbCO!x1i;%i8jkgblp~+I(1yA#$*W#t*K1nGR$w# zwxu9+3UQV8mN^vpJ?oyErT?%-fK7ygXJlSMiC6NO_9cGmp~`7(ZcoZzI;acpT0BGl zhj6R&9{2WXk3VFC&iH~o4QVdTMx8!@Nj_VC;}j6)xYY*n2}mxb^~*WX1%Fk3s8BI$ zWbRY#y4AZ92GS%9PuJ|mO;`A-NF0J_Fhf1cgWvfUC*5_Z>Rx~t;H9U@*h3jvW}jl< zJ10ra)i!X$i(P62@_cepx_Hwn0M>q<+R^h^HZTTTX|$vgyjbGGM1%px85(mq^zSA6 zCv9ntzr~T4Z6KHK6uCP&W=k_)zsa0_HCD?{2o6e})9uls$=8pwSC&?1Y};_;waRhT zj{iFI{ur~{zVNzQIz47?9(UFaIN_@1>=@L~=n6AzK z@LC}7*rY{!VrD=E#PfEJM&yefCo;HsW<#37;>b*a0DDa!kZ_Ungp1vD@#5@fZ(L1$ zuZmysxNf`VVh59yLtLtF<3+4$v*_n~d8bD(NR#~@GwjAsA*p;pNsZqW@b$0YH6f}# zUeO}nkuh3!_Xp9#(N=MYpwwy8XLiM<%>s}48B`~)NffKpQFZ+qY~Ry)Lg|gAV^tr0 hW-F;{n0pP$&s#O(^Gy)4y~_U|2&{y$5uagzW5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_bar_chart_top.webp b/app/src/main/res/mipmap-xxhdpi/ic_bar_chart_top1.webp similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/ic_bar_chart_top.webp rename to app/src/main/res/mipmap-xxhdpi/ic_bar_chart_top1.webp diff --git a/app/src/main/res/mipmap-xxhdpi/ic_bar_chart_top2.webp b/app/src/main/res/mipmap-xxhdpi/ic_bar_chart_top2.webp new file mode 100644 index 0000000000000000000000000000000000000000..11a68b31d88460effbd5e041195cf1e852cb4782 GIT binary patch literal 534 zcmV+x0_puyNk&Ev0ssJ4MM6+kP&il$0000G0000x000pH06|PpNaX+k00n?s+qSCe zj6vk?uGvd*DS+3&OJ5D7w89{DhX&l?TjuVrk?XzZHxLnw+_nv4w%yKp22c{HR634> zWc%g{kcoXht2n2S9AP%>pzlLLq6wrJsy_65JgX5A^ugne zgcIi9`ydk<<2-}W2LJ$8P&gn00RR9{2mqY{Dm(xZ06vjIno1?3q9LRVkgyU7YyhWC z+B(1N+##C8WmF(P9e$L1|LuVNQ1mnX0QUjB0q6ny0oGOmQoEG#C{OoEx}X65?BdIP ztmRifUJ^=Otn4?+Cc)S0630zTia59=lt$01q!_FsCUzvm?53I~X5m&8^ImM6f(2Z0 zy(D&^Lg(#Ff6tAMBd>R?ULF5ayo*x?>^!~9Or&aD+YV9QU~LlY4TY)48|`F z?840-D!LI(+3R=%?nRfWg-`$N^gT~OzTl6E&J~GH5I}}Mxf~s8W54e$|Nj4MUxQvK Yv#jk<&2_fj{`Ia?yVt^sW)ca&0B*|ssQ>@~ literal 0 HcmV?d00001