Android的Kotlin嘗試之旋轉餅圖3

第三步:實現餅圖點擊後自動旋轉至底端

改動部分源碼:

	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號區域正對下方.

效果圖:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章