From 2f63393f18ec593659520927e4c015f84c2b1cf9 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期四, 06 三月 2025 14:34:05 +0800
Subject: [PATCH] fix: 热力图矩阵
---
app/src/main/res/layout/layout_year_stats.xml | 43 ++++++++++++++-------
app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt | 62 ++++++++++++++++++++++---------
app/src/main/res/drawable/avg_package.xml | 12 ++++++
3 files changed, 85 insertions(+), 32 deletions(-)
diff --git a/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt b/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt
index 794ece9..dadbe96 100644
--- a/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt
+++ b/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() // 更新年度统计数据
}
}
}
diff --git a/app/src/main/res/drawable/avg_package.xml b/app/src/main/res/drawable/avg_package.xml
new file mode 100644
index 0000000..cf552e9
--- /dev/null
+++ b/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>
diff --git a/app/src/main/res/layout/layout_year_stats.xml b/app/src/main/res/layout/layout_year_stats.xml
index 7f3c243..aa8a654 100644
--- a/app/src/main/res/layout/layout_year_stats.xml
+++ b/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>
\ No newline at end of file
--
Gitblit v1.9.3