feat: 为饼图添加点击事件
1. 为CategoryPieChart添加点击事件处理 2. 点击饼图可跳转到对应类别详情页面
This commit is contained in:
parent
8339d3d5da
commit
f134304646
@ -12,16 +12,20 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.compose.ui.viewinterop.AndroidView
|
import androidx.compose.ui.viewinterop.AndroidView
|
||||||
import com.github.mikephil.charting.charts.PieChart
|
import com.github.mikephil.charting.charts.PieChart
|
||||||
import com.github.mikephil.charting.components.Legend
|
import com.github.mikephil.charting.components.Legend
|
||||||
|
import com.github.mikephil.charting.data.Entry
|
||||||
import com.github.mikephil.charting.data.PieData
|
import com.github.mikephil.charting.data.PieData
|
||||||
import com.github.mikephil.charting.data.PieDataSet
|
import com.github.mikephil.charting.data.PieDataSet
|
||||||
import com.github.mikephil.charting.data.PieEntry
|
import com.github.mikephil.charting.data.PieEntry
|
||||||
import com.github.mikephil.charting.formatter.PercentFormatter
|
import com.github.mikephil.charting.formatter.PercentFormatter
|
||||||
|
import com.github.mikephil.charting.highlight.Highlight
|
||||||
|
import com.github.mikephil.charting.listener.OnChartValueSelectedListener
|
||||||
import com.github.mikephil.charting.utils.ColorTemplate
|
import com.github.mikephil.charting.utils.ColorTemplate
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun CategoryPieChart(
|
fun CategoryPieChart(
|
||||||
categoryData: List<Pair<String, Float>>,
|
categoryData: List<Pair<String, Float>>,
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier,
|
||||||
|
onCategoryClick: (String) -> Unit = {}
|
||||||
) {
|
) {
|
||||||
val isDarkTheme = isSystemInDarkTheme()
|
val isDarkTheme = isSystemInDarkTheme()
|
||||||
val textColor = MaterialTheme.colorScheme.onSurface.toArgb()
|
val textColor = MaterialTheme.colorScheme.onSurface.toArgb()
|
||||||
@ -50,6 +54,21 @@ fun CategoryPieChart(
|
|||||||
|
|
||||||
// 设置中心文字颜色跟随主题
|
// 设置中心文字颜色跟随主题
|
||||||
setCenterTextColor(textColor)
|
setCenterTextColor(textColor)
|
||||||
|
|
||||||
|
// 添加点击事件监听器
|
||||||
|
setOnChartValueSelectedListener(object : OnChartValueSelectedListener {
|
||||||
|
override fun onValueSelected(e: Entry?, h: Highlight?) {
|
||||||
|
e?.let {
|
||||||
|
if (it is PieEntry) {
|
||||||
|
onCategoryClick(it.label ?: return)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onNothingSelected() {
|
||||||
|
// 不需要处理
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
update = { chart ->
|
update = { chart ->
|
||||||
|
@ -70,22 +70,28 @@ fun AnalysisScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 饼图
|
// 使用LazyColumn包含饼图和列表
|
||||||
if (selectedAnalysisType != AnalysisType.TREND) {
|
|
||||||
CategoryPieChart(
|
|
||||||
categoryData = categoryStats.map { Pair(it.category, it.percentage.toFloat()) },
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxWidth()
|
|
||||||
.height(200.dp)
|
|
||||||
.padding(16.dp)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 分类统计列表
|
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
contentPadding = PaddingValues(16.dp)
|
contentPadding = PaddingValues(16.dp)
|
||||||
) {
|
) {
|
||||||
|
// 添加饼图作为第一个项目
|
||||||
|
if (selectedAnalysisType != AnalysisType.TREND) {
|
||||||
|
item {
|
||||||
|
CategoryPieChart(
|
||||||
|
categoryData = categoryStats.map { Pair(it.category, it.percentage.toFloat()) },
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.height(200.dp)
|
||||||
|
.padding(bottom = 16.dp),
|
||||||
|
onCategoryClick = { category ->
|
||||||
|
onNavigateToCategoryDetail(category, selectedMonth)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加分类统计列表项目
|
||||||
items(categoryStats) { stat ->
|
items(categoryStats) { stat ->
|
||||||
CategoryStatItem(
|
CategoryStatItem(
|
||||||
stat = stat,
|
stat = stat,
|
||||||
|
Loading…
Reference in New Issue
Block a user