MPAndroid--Android图表之饼图

饼图适合在什么地方使用?
饼图主要用于展现不同类别数值相对于总数的占比情况。图中每个分块(扇区)的弧长表示该类别的占比大小,所有分块数据总和为100%。当分块过多,容易造成饼图丑化,建议尽量将饼图分块数量控制在五个以内。当数据类别较多时,可以把较小或不重要的数据合并成第五个模块命名为"其它"。如果各类别都必须全部展示,此时选择柱状图或堆积柱状图或许更合适。

Android目前并没有原生支持的图表Api,所以如果要类似饼图之类的图表,自能自己撸代码或者用别人的轮子。自己撸代码,费时费力,而且容易引入无数的Bug。目前在GitHub比较成熟的的图表库就是MPAndroid,英文水平不错的可以撸文档,或者用Google翻译。
MPAndroid Github地址

下面是个人快速入门教程。Kotlin语言开发,Java也类似。

在项目工程Gradle

repositories {
    maven { url 'https://jitpack.io' }
}

在组件Gradle

dependencies {
    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0-alpha'
}

同步一下Gradle就可以使用了。在布局文件使用PieChart视图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.github.mikephil.charting.charts.PieChart
        android:id="@+id/pieChart"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

由于我们没有设置数据,此时把Demo跑起来是界面只有一行"No chart data available"。这行提示我们也可以通过``设置的,在没有数据的时候回提醒用户。
activity简单添加数据:

  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(activity_pie_chart)

        pieChart.setNoDataText("老哥,我还没吃饭呢,快给我数据")


        val pieEntry1 = PieEntry(100f)
        val pieEntry2 = PieEntry(300f)
        val pieEntry3 = PieEntry(500f)

        val list = mutableListOf(pieEntry1, pieEntry2, pieEntry3)

        val pieDataSet = PieDataSet(list, "用户量")

        val pieData = PieData(pieDataSet!!)

        pieChart.data = pieData

        pieChart.invalidate()

    }

查看效果,丑不拉几的


效果图1

重新配置一下数据和颜色

  pieChart.setNoDataText("老哥,我还没吃饭呢,快给我数据")


        val pieEntry1 = PieEntry(10f,"北京")
        val pieEntry2 = PieEntry(40f,"上海")
        val pieEntry3 = PieEntry(15f,"杭州")
        val pieEntry4 = PieEntry(35f,"深圳")

        val list = mutableListOf(pieEntry1, pieEntry2, pieEntry3,pieEntry4)

        val pieDataSet = PieDataSet(list, "")

        //一般有多少项数据,就配置多少个颜色的,少的话会复用最后一个颜色,多的话无大碍
        pieDataSet.colors = mutableListOf(Color.parseColor("#feb64d"),
                Color.parseColor("#ff7c7c"),
                Color.parseColor("#9287e7"),
                Color.parseColor("#60acfc"))

        val pieData = PieData(pieDataSet!!)

        pieChart.data = pieData
        //显示值格式化,这里使用Api,添加百分号
        pieData.setValueFormatter(PercentFormatter())
        //设置值得颜色
        pieData.setValueTextColor(Color.parseColor("#FFFFFF"))
        //设置值得大小
        pieData.setValueTextSize(10f)

        val description=Description()

        description.text=""
        //把右下边的Description label 去掉,同学也可以设置成饼图说明
        pieChart.description=description

        //去掉中心圆,此时中心圆半透明
        pieChart.holeRadius=0f
        //去掉半透明
        pieChart.setTransparentCircleAlpha(0)

        pieChart.setDrawEntryLabels(true)

        pieChart.invalidate()
效果图2
  1. 如果对于饼图中的%号不满意,想定制成其他符号,可以继承类IValueFormatter,重写getFormattedValue方法被设置到饼图就可以。
  2. 饼图中显示图例的值,可以通过pieChart.setDrawEntryLabels方法的参数truefalse来控制是否显示
  3. 值的问题,这里并不会根据去求百分比,在创建PieEntry的时候,大家根据自己需求去设置值,还有图例的名称。如这里的北京,上海,杭州,深圳。
  4. 通过效果图1知道,效果是圆圈不是圆饼,通过设置pieChart.setTransparentCircleAlpha(0)pieChart.holeRadius=0f达到实现圆饼效果。
    5.我们也可以设置左下图图例的位置和顺序。
pcMonthItem.legend.direction = Legend.LegendDirection.LEFT_TO_RIGHT
pcMonthItem.legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER

图例的顺序,通过API来看,目前仅支持顺序左到右,右到左LEFT_TO_RIGHT, RIGHT_TO_LEFT
而图例的位置,支持左,中,右。 LEFT, CENTER, RIGHT。当然,也支持竖向排列,具体可以参考pcMonthItem.legend.verticalAlignment
6.也可以给饼图添加动画效果。如pieChart.animateXY(3000,3000)
pieChart.animateXY(3000,3000)

最终效果图

作为一个成熟的第三库,它能做的不止这么多,而且作者一直在不断的优化。向高手致敬。
各种同学在使用的过程中,如果有什么问题可以留言。建议撸官方文档。

推荐阅读
独立开发的一个APP,你要的都有
Android实现App框架
百度网盘破解下载

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容