第三步:實現餅圖點擊後自動旋轉至底端
改動部分源碼:
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號區域正對下方.