cloudroam
2025-03-06 2f63393f18ec593659520927e4c015f84c2b1cf9
fix: 热力图矩阵
已修改2个文件
已添加1个文件
117 ■■■■ 文件已修改
app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/avg_package.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_year_stats.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt
@@ -423,24 +423,44 @@
            // 更新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)
                }
                // 添加热力图单元格
@@ -448,12 +468,15 @@
                    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)
                    }
@@ -465,12 +488,11 @@
    }
    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")
        }
    }
@@ -482,6 +504,7 @@
                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 -> {
                // 周和月视图显示柱状图和饼图,隐藏包裹列表
@@ -490,6 +513,7 @@
                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()
            }
@@ -500,8 +524,10 @@
                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()  // 更新年度统计数据
            }
        }
    }
app/src/main/res/drawable/avg_package.xml
对比新文件
@@ -0,0 +1,12 @@
<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>
app/src/main/res/layout/layout_year_stats.xml
@@ -13,24 +13,34 @@
        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
@@ -40,22 +50,27 @@
        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>