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 0000000..9014fef Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_bar_chart2.9.png differ 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 0000000..11a68b3 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_bar_chart_top2.webp differ