第三步:实现饼图点击后自动旋转至底端
改动部分源码:
private fun initView() {
setData()
//这边多了个对饼图的个性化设置
mCharPS()
}
private fun mCharPS() {
val description = Description()
description.text = ""
with(mChart){//使用Kotlin的with简化程序
setEntryLabelTextSize(24f)//设置标题字体大小
data.setValueTextSize(24f)//设置数值字体大小
this.description = description//设置描述
legend.isEnabled = false//取消图例
isRotationEnabled = false//取消旋转
setOnChartValueSelectedListener(object : OnChartValueSelectedListener {
override fun onNothingSelected() {//当取消选定区域时的动作实现,这里默认什么都不做
return
}
override fun onValueSelected(e: Entry?, h: Highlight?) {//当区域被选取的动作实现,这里的功能是区域被选取时,被选取区域旋转至正下方
val ratio = 360 / mChart.data.yValueSum
val x = (h?.x ?: 0f).toInt()
val angleByIndex = { i: Int -> mChart.data.dataSet.getEntryForIndex(i).value }
var angle = 90f
for (i in x downTo 0) {
angle -= angleByIndex(i) * ratio
}
angle += angleByIndex(x) * ratio / 2
isRotationEnabled = true
rotationAngle = angle
isRotationEnabled = false
}
})
}
}
一些设计思路:
在设计将区域旋转至正下方时需要一定的计算:
val ratio=360/mChart.data.yValueSum
获得比例系数,即饼图数据总和后每份分配的度数.
val x=(h?.x?:0f).toInt()
得到当前区域的index,在这里是0或1或2
val angleByIndex={i:Int->mChart.data.dataSet.getEntryForIndex(i).value}
这里运用lambda申明一个匿名函数,通过Index获得该Index区域的值
var angle=90f
先设定饼图的基础旋转值为90度(默认已经旋转了270度,再旋转90度到初始点)
for (i in x downTo 0){
angle-=angleByIndex(i)*ratio
}
angle+=angleByIndex(x)*ratio/2
这里将饼图再逆转一定度数:当其为2号区域时,就需要回退0号和1号及2号的区域所占度数然后再顺转多转的半个2号区域,使2号区域正对下方.