Android的Kotlin尝试之记账APP3

第三步:实现饼图点击后自动旋转至底端

改动部分源码:

    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号区域正对下方.

效果图:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_37258787/article/details/79283673