效果图
导入依赖库
//数学图表
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
xml使用
<com.github.mikephil.charting.charts.BarChart
android:id="@+id/recordBarchart"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="@dimen/dp_10"
android:layout_marginBottom="@dimen/dp_10"/>
代码
fun initBarChart(thisMonthToWeekFlowList : List<Long> ) {
val entries = ArrayList<BarEntry>()//柱状图填充的数据,BarEntry()类第一个参数作用类似于索引,第二参数就是索引对应的值
val xAxisTextList = ArrayList<String>() //x轴每个柱子下显示的文本列表
var maxDataUsage = 0f
for (i in 0 until thisMonthToWeekFlowList.size) {
val dataUsage = FlowUtils.getByteFromMb(thisMonthToWeekFlowList[i])
entries.add(BarEntry((i.toFloat()), dataUsage))
xAxisTextList.add(
when(i){
0 -> "第一周"
1 -> "第二周"
2 -> "第三周"
3 -> "第四周"
4 -> "第五周"
5 -> "第六周"
else -> "无效周"
}.toString()
)
if (dataUsage > maxDataUsage) {
maxDataUsage = dataUsage
}
}
if (maxDataUsage == 0f) {
binding.noUseFlowLayout.visibility = View.VISIBLE
binding.showAllAppUseFlowDataLayot.visibility = View.GONE
return
} else {
binding.noUseFlowLayout.visibility = View.GONE
binding.showAllAppUseFlowDataLayot.visibility = View.VISIBLE
}
val dataSet = BarDataSet(entries, "流量消耗数")
dataSet.color = ContextCompat.getColor(requireContext(), R.color.color_88D7ED)
val data = BarData(dataSet)
data.setBarWidth(0.5f)//每个柱子的宽度 0~1f
binding.recordBarchart.description.isEnabled = false //关闭描述
binding.recordBarchart.legend.isEnabled = false //关闭图例
val xAxis: XAxis = binding.recordBarchart.xAxis
xAxis.granularity = 1F
xAxis.setLabelCount(xAxisTextList.size) //设置X标签个数
xAxis.position = XAxis.XAxisPosition.BOTTOM // 设置 X 轴位置在底部
xAxis.valueFormatter = IndexAxisValueFormatter(xAxisTextList)
val yAxis: YAxis = binding.recordBarchart.axisLeft
yAxis.axisMinimum = 0f // Y 轴最小值
val numData = getNumData(maxDataUsage)
yAxis.axisMaximum = numData["num"]!!.toFloat() // Y 轴最大值
yAxis.granularity = numData["size"]!!.toFloat() // Y 轴间隔
yAxis.setDrawGridLines(false) // 禁用网格线
// 设置Y轴值格式化器
yAxis.setValueFormatter(object : ValueFormatter() {
override fun getFormattedValue(value: Float): String {
return "${value.toInt()} MB" // 在Y轴添加"MB"
}
})
// 不显示竖线
binding.recordBarchart.xAxis.setDrawGridLines(false)
// 禁用右侧 Y 轴
binding.recordBarchart.axisRight.isEnabled = false
binding.recordBarchart.setTouchEnabled(false) //关闭触摸事件
binding.recordBarchart.data = data
binding.recordBarchart.invalidate()
}
//动态设置Y轴的最大值和间隔
fun getNumData(i : Float) : HashMap<String,Int>{
val numMap = HashMap<String,Int>()
when{
i<=10 ->{
numMap["num"] = 10
numMap["size"] = 1
}
i<=100 ->{
numMap["num"] = i.toInt()/10 *10 +10
numMap["size"] = 10
}
i<=1000 -> {
numMap["num"] = i.toInt()/100 *100 +100
numMap["size"] = 100
}else ->{
numMap["num"] = i.toInt()/1000 *1000 +1000
numMap["size"] = 1000
}
}
return numMap
}
详细可以去这里学:
安卓图形之MPAndroidChart3.0详解三——柱状图(一)(属性篇)_mpandroidchart 柱状图-CSDN博客