| | |
| | | |
| | | // 更新UI |
| | | binding.layoutWeekStats.heatmapYearly.apply { |
| | | // 清除现有的子视图 |
| | | removeAllViews() |
| | | |
| | | // 创建网格布局 |
| | | val gridLayout = GridLayout(context).apply { |
| | | rowCount = 7 |
| | | columnCount = 52 |
| | | rowCount = 8 // 增加一行用于显示月份 |
| | | columnCount = 53 // 增加一列用于显示星期标签 |
| | | } |
| | | |
| | | // 添加日期标签 |
| | | val dayLabels = arrayOf("周日", "周一", "周二", "周三", "周四", "周五", "周六") |
| | | for (i in 0..6) { |
| | | // 添加月份标签 |
| | | val months = arrayOf("1月", "2月", "3月", "4月", "5月", "6月", |
| | | "7月", "8月", "9月", "10月", "11月", "12月") |
| | | months.forEachIndexed { index, month -> |
| | | val label = TextView(context).apply { |
| | | text = dayLabels[i] |
| | | text = month |
| | | textSize = 10f |
| | | setPadding(0, 0, 8, 0) |
| | | setPadding(0, 0, 8, 4) |
| | | // 计算每个月份标签的位置 |
| | | val weekPosition = (index * 4.3).toInt() |
| | | val params = GridLayout.LayoutParams() |
| | | params.columnSpec = GridLayout.spec(weekPosition + 1) |
| | | params.rowSpec = GridLayout.spec(0) |
| | | layoutParams = params |
| | | } |
| | | gridLayout.addView(label) |
| | | } |
| | | |
| | | // 添加星期标签 |
| | | val dayLabels = arrayOf("周一", "周二", "周三", "周四", "周五", "周六", "周日") |
| | | dayLabels.forEachIndexed { index, label -> |
| | | val textView = TextView(context).apply { |
| | | text = label |
| | | textSize = 10f |
| | | setPadding(4, 0, 8, 0) |
| | | val params = GridLayout.LayoutParams() |
| | | params.columnSpec = GridLayout.spec(0) |
| | | params.rowSpec = GridLayout.spec(index + 1) |
| | | layoutParams = params |
| | | } |
| | | gridLayout.addView(textView) |
| | | } |
| | | |
| | | // 添加热力图单元格 |
| | |
| | | for (week in 0..51) { |
| | | val count = heatmapMatrix[day][week] |
| | | val cell = View(context).apply { |
| | | layoutParams = ViewGroup.LayoutParams( |
| | | resources.getDimensionPixelSize(R.dimen.heatmap_cell_size), |
| | | resources.getDimensionPixelSize(R.dimen.heatmap_cell_size) |
| | | ) |
| | | val params = GridLayout.LayoutParams().apply { |
| | | width = resources.getDimensionPixelSize(R.dimen.heatmap_cell_size) |
| | | height = resources.getDimensionPixelSize(R.dimen.heatmap_cell_size) |
| | | columnSpec = GridLayout.spec(week + 1) |
| | | rowSpec = GridLayout.spec(day + 1) |
| | | setMargins(1, 1, 1, 1) |
| | | } |
| | | layoutParams = params |
| | | setBackgroundColor(getHeatmapColor(count)) |
| | | setPadding(1, 1, 1, 1) |
| | | } |
| | | gridLayout.addView(cell) |
| | | } |
| | |
| | | } |
| | | |
| | | private fun getHeatmapColor(count: Int): Int { |
| | | // 根据数量返回不同深浅的颜色 |
| | | return when { |
| | | count == 0 -> Color.parseColor("#EBEDF0") |
| | | count <= 2 -> Color.parseColor("#9BE9A8") |
| | | count <= 4 -> Color.parseColor("#40C463") |
| | | count <= 6 -> Color.parseColor("#30A14E") |
| | | count == 1 -> Color.parseColor("#9BE9A8") |
| | | count == 2 -> Color.parseColor("#40C463") |
| | | count <= 4 -> Color.parseColor("#30A14E") |
| | | else -> Color.parseColor("#216E39") |
| | | } |
| | | } |
| | |
| | | binding.recyclerPackages.visibility = View.VISIBLE |
| | | binding.layoutWeekStats.root.visibility = View.GONE |
| | | binding.layoutYearStats.root.visibility = View.GONE |
| | | binding.cardPackageStats.visibility = View.VISIBLE // 显示包裹统计卡片 |
| | | } |
| | | DateType.WEEK, DateType.MONTH -> { |
| | | // 周和月视图显示柱状图和饼图,隐藏包裹列表 |
| | |
| | | binding.layoutYearStats.root.visibility = View.GONE |
| | | binding.layoutWeekStats.chartDailyPackages.visibility = View.VISIBLE |
| | | binding.layoutWeekStats.heatmapYearly.visibility = View.GONE |
| | | binding.cardPackageStats.visibility = View.VISIBLE // 显示包裹统计卡片 |
| | | updateBarChartData() |
| | | updatePieChartData() |
| | | } |
| | |
| | | binding.layoutYearStats.root.visibility = View.VISIBLE |
| | | binding.layoutWeekStats.chartDailyPackages.visibility = View.GONE |
| | | binding.layoutWeekStats.heatmapYearly.visibility = View.VISIBLE |
| | | binding.cardPackageStats.visibility = View.GONE // 隐藏包裹统计卡片 |
| | | updateHeatmapData() |
| | | updatePieChartData() |
| | | updateYearlyStats() // 更新年度统计数据 |
| | | } |
| | | } |
| | | } |
对比新文件 |
| | |
| | | <vector xmlns:android="http://schemas.android.com/apk/res/android" |
| | | android:width="32dp" |
| | | android:height="32dp" |
| | | android:viewportWidth="1024" |
| | | android:viewportHeight="1024"> |
| | | <path |
| | | android:pathData="M789.3,996.3h-537.6c-81.1,0 -147.2,-66.1 -147.2,-147.2V409.6c0,-81.1 66.1,-147.2 147.2,-147.2h537.6c81.1,0 147.2,66.1 147.2,147.2v439.5c0,81.1 -66.1,147.2 -147.2,147.2zM251.7,326.4c-44.8,0 -83.2,36.3 -83.2,83.2v439.5c0,44.8 36.3,83.2 83.2,83.2h537.6c44.8,0 83.2,-36.3 83.2,-83.2V409.6c0,-44.8 -36.3,-83.2 -83.2,-83.2h-537.6z" |
| | | android:fillColor="#543E3E"/> |
| | | <path |
| | | android:pathData="M693.3,437.3c-17.1,0 -32,-14.9 -32,-32V198.4c0,-64 -61.9,-115.2 -138.7,-115.2S384,134.4 384,198.4v206.9c0,17.1 -14.9,32 -32,32s-32,-14.9 -32,-32V198.4c0,-98.1 91.7,-179.2 202.7,-179.2s202.7,78.9 202.7,179.2v206.9c0,17.1 -14.9,32 -32,32zM640,827.7H403.2c-17.1,0 -32,-14.9 -32,-32s14.9,-32 32,-32H640c17.1,0 32,14.9 32,32s-14.9,32 -32,32z" |
| | | android:fillColor="#FFBB12"/> |
| | | </vector> |
| | |
| | | android:orientation="vertical" |
| | | android:gravity="center"> |
| | | |
| | | <ImageView |
| | | android:layout_width="48dp" |
| | | android:layout_height="48dp" |
| | | android:src="@drawable/ic_package" /> |
| | | |
| | | <TextView |
| | | android:id="@+id/text_total_packages" |
| | | android:layout_width="wrap_content" |
| | | android:layout_height="wrap_content" |
| | | android:textSize="24sp" |
| | | android:textStyle="bold" |
| | | android:text="0个" /> |
| | | android:textColor="@color/purple_500" |
| | | android:text="4"/> |
| | | |
| | | <TextView |
| | | android:layout_width="wrap_content" |
| | | android:layout_height="wrap_content" |
| | | android:text="年度包裹总数" /> |
| | | android:layout_marginTop="4dp" |
| | | android:text="年度包裹总数" |
| | | android:textSize="12sp"/> |
| | | |
| | | <ImageView |
| | | android:layout_width="24dp" |
| | | android:layout_height="24dp" |
| | | android:layout_marginTop="8dp" |
| | | android:src="@drawable/resource_package"/> |
| | | </LinearLayout> |
| | | |
| | | <!-- 分隔线 --> |
| | | <View |
| | | android:layout_width="1dp" |
| | | android:layout_height="match_parent" |
| | | android:background="#E0E0E0"/> |
| | | |
| | | <!-- 平均每天包裹数 --> |
| | | <LinearLayout |
| | |
| | | android:orientation="vertical" |
| | | android:gravity="center"> |
| | | |
| | | <ImageView |
| | | android:layout_width="48dp" |
| | | android:layout_height="48dp" |
| | | android:src="@drawable/ic_average" /> |
| | | |
| | | <TextView |
| | | android:id="@+id/text_daily_average" |
| | | android:layout_width="wrap_content" |
| | | android:layout_height="wrap_content" |
| | | android:textSize="24sp" |
| | | android:textStyle="bold" |
| | | android:text="0.00" /> |
| | | android:textColor="@color/purple_500" |
| | | android:text="0.29"/> |
| | | |
| | | <TextView |
| | | android:layout_width="wrap_content" |
| | | android:layout_height="wrap_content" |
| | | android:text="平均每天包裹数" /> |
| | | android:layout_marginTop="4dp" |
| | | android:text="平均每天包裹数" |
| | | android:textSize="12sp"/> |
| | | |
| | | <ImageView |
| | | android:layout_width="24dp" |
| | | android:layout_height="24dp" |
| | | android:layout_marginTop="8dp" |
| | | android:src="@drawable/avg_package"/> |
| | | </LinearLayout> |
| | | |
| | | </LinearLayout> |