Android 实现柱形图

news2024/12/25 0:24:56

在 Android 中实现柱状图,可以使用流行的图表库 MPAndroidChart,它支持多种类型的图表,包括柱状图、折线图、饼图等。下面是一个基本的柱状图实现步骤,具体分为以下几个部分:

1. 添加依赖

首先,你需要在 build.gradle 文件中添加 MPAndroidChart 库的依赖。 

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

如果上述导入后发现在External Libraries下没有找到Chart的文件,则在settings.gradle里去添加这个

2. 创建布局文件(XML)

在你的布局文件activity_main.xml中添加一个 BarChart 控件,它是 MPAndroidChart 提供的用于显示柱状图的控件。

<?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"
    android:padding="16dp">

    <!--柱状图-->
    <com.github.mikephil.charting.charts.BarChart
        android:id="@+id/barChart"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

</LinearLayout>

3. 配置柱状图数据

在你的 ActivityFragment 中,使用 MPAndroidChart 来设置柱状图的数据。

package com.example.kotlinlearn

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet
import com.github.mikephil.charting.data.BarEntry
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter

class MainActivity : AppCompatActivity() {

    private lateinit var barChart: BarChart

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 初始化图表
        barChart = findViewById(R.id.barChart)

        // 准备数据
        val entries = arrayListOf(
            BarEntry(0f, 10f),
            BarEntry(1f, 20f),
            BarEntry(2f, 30f)
        )

        // 创建数据集
        val barDataSet = BarDataSet(entries, "成绩")

        // 可选:设置柱状图的颜色
        barDataSet.color = getColor(R.color.purple_200)  // 用 getColor 替代 resources.getColor

        // 创建 BarData
        val barData = BarData(barDataSet)
        barData.barWidth = 0.9f  // 设置柱状图的宽度

        // 设置数据到图表
        barChart.data = barData

        // 设置一些样式
        barChart.description.isEnabled = false  // 禁用描述文本
        barChart.setFitBars(true)  // 让柱状图适应宽度
        barChart.animateY(1000)  // 设置动画效果

        // 设置 X 轴标签
        val xLabels = arrayOf("Math", "English", "Science")
        barChart.xAxis.valueFormatter = IndexAxisValueFormatter(xLabels)
        barChart.xAxis.granularity = 1f  // 确保每个条目都有标签
        barChart.xAxis.isGranularityEnabled = true  // 启用粒度

        // 刷新图表
        barChart.invalidate()
    }
}

展示之后的样式如下:

这段代码是一个使用 MPAndroidChart 库实现柱状图显示的简单 Android 示例。它展示了如何在 MainActivity 中创建一个柱状图,并设置一些基本属性和数据。下面逐行解释代码的含义:

1. package com.example.kotlinlearn

  • 这是声明当前类所在的包名。包名用来组织项目中的类,避免类名冲突。

2. 导入所需的库

  • MPAndroidChart 库中的类:
    • BarChart: 用于显示柱状图的控件。
    • BarData: 用于处理并展示柱状图的数据。
    • BarDataSet: 一个数据集,它包含了要在柱状图中显示的所有数据。
    • BarEntry: 存储每个柱状图的数据(例如柱的高度和位置)。
    • IndexAxisValueFormatter: 用于设置 X 轴标签格式化的类。

3. MainActivity

  • private lateinit var barChart: BarChart:声明一个 BarChart 类型的变量 barChart,并使用 lateinit 来延迟初始化。lateinit 是 Kotlin 中的特性,允许你稍后初始化变量。

4. onCreate 方法

override fun onCreate(savedInstanceState: Bundle?) {                 
   super.onCreate(savedInstanceState) 
   setContentView(R.layout.activity_main)
}
  • onCreate() 是 Android 中 Activity 的生命周期方法之一,在活动被创建时调用。savedInstanceState 包含活动被重建时的状态(如果有)。
  • setContentView(R.layout.activity_main):设置当前 Activity 使用的布局文件为 activity_main.xml,在这个布局文件中包含了一个 BarChart 控件。

5. 初始化柱状图并设置数据

barChart = findViewById(R.id.barChart)
  • 通过 findViewById 查找布局中的 BarChart 控件,并将其赋值给 barChart 变量。

6. 准备柱状图的数据

val entries = arrayListOf( 
    BarEntry(0f, 10f), 
    BarEntry(1f, 20f), 
    BarEntry(2f, 30f) 
)
  • entries 是一个 ArrayList,存储了柱状图的数据。
  • BarEntry(x, y):表示一个柱状图条目。第一个参数 x 是横坐标(通常表示分类),第二个参数 y 是纵坐标(表示柱的高度或数值)。
    • 第一根柱子的位置为 x=0,高度为 y=10
    • 第二根柱子的位置为 x=1,高度为 y=20
    • 第三根柱子的位置为 x=2,高度为 y=30

7. 创建数据集

val barDataSet = BarDataSet(entries, "成绩")
  • BarDataSet 是柱状图的数据集,它包含了多个 BarEntry,表示一组数据。
  • "成绩" 是该数据集的标签,显示在图表的图例中。

8. 设置数据集的颜色

barDataSet.color = getColor(R.color.purple_200)
  • barDataSet.color 设置柱状图的颜色。这里使用了 getColor(R.color.purple_200) 来获取颜色资源。

9. 创建 BarData 对象

val barData = BarData(barDataSet) barData.barWidth = 0.9f
  • BarData 包含了 BarDataSet 数据集,它实际上是数据和样式的集合,用来给柱状图控件设置数据。
  • barData.barWidth = 0.9f 设置每根柱子的宽度为 0.9f(占用图表总宽度的90%),避免柱子之间有太大的间隙。

10. 设置柱状图的样式

barChart.data = barData barChart.description.isEnabled = false 
barChart.setFitBars(true) barChart.animateY(1000)
  • barChart.data = barData:将准备好的 BarData 设置到 barChart 上,实际上就是给图表提供了数据。
  • barChart.description.isEnabled = false:禁用图表的描述文本,通常描述文本用于说明图表的标题,这里不需要。
  • barChart.setFitBars(true):让柱状图适应宽度,这样所有的柱子都会自动调整合适的宽度。
  • barChart.animateY(1000):给图表添加 Y 轴方向的动画效果,持续时间为 1000 毫秒。

11. 设置 X 轴标签

val xLabels = arrayOf("Math", "English", "Science") 
barChart.xAxis.valueFormatter = IndexAxisValueFormatter(xLabels) 
barChart.xAxis.granularity = 1f 
barChart.xAxis.isGranularityEnabled = true
  • xLabels 是一个包含 X 轴标签的数组,分别是 "Math", "English", "Science"
  • barChart.xAxis.valueFormatter = IndexAxisValueFormatter(xLabels):使用 IndexAxisValueFormatter 格式化 X 轴的标签,将它们设置为 xLabels 中定义的值。
  • barChart.xAxis.granularity = 1f:设置 X 轴的粒度,确保每个条目都能显示一个标签。
  • barChart.xAxis.isGranularityEnabled = true:启用粒度,使得 X 轴的标签能正常显示。

12. 刷新图表

barChart.invalidate()
  • invalidate() 方法会强制图表刷新,确保图表根据最新的数据重新绘制。

总结

这段代码的目的是在 MainActivity 中创建一个简单的柱状图,显示三科成绩的柱状数据,并自定义了一些图表的样式(如颜色、动画效果和 X 轴标签)。通过使用 MPAndroidChart 库,简化了柱状图的创建过程,使得数据的可视化更加直观。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过交互式网页学习相机成像原理

​ 入门摄影这门艺术&#xff0c;你是否有以下这些问题&#xff1f; 焦距、光圈、CMOS是什么&#xff1f;为什么光圈越大&#xff0c;背景虚化效果越好&#xff1f;什么是过曝&#xff1f;… 今天我将分享一个简单的、可交互的相机成像模型&#xff0c;可供大家以可视化的方式…

web——sqliabs靶场——第一关

今天开始搞这个靶场&#xff0c;从小白开始一点点学习,加油&#xff01;&#xff01;&#xff01;&#xff01; 1.搭建靶场 注意点&#xff1a;1.php的版本问题&#xff0c;要用老版本 2.小p要先改数据库的密码&#xff0c;否则一直显示链接不上数据库 2.第一道题&#xff0…

自监督学习:机器学习的未来新方向

引言 自监督学习&#xff08;Self-Supervised Learning, SSL&#xff09;是近年来机器学习领域的一个重要发展方向&#xff0c;迅速成为许多研究和应用的热点。与传统的监督学习不同&#xff0c;自监督学习利用未标注数据&#xff0c;通过设计自我生成标签的任务&#xff0c;帮…

探索 HTML 和 CSS 实现的 3D 开关按钮

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个3D风格的开关按钮&#xff08;通常用于控制某些设置的开启或关闭&#xff09; HTML <label class"switch"><input type"checkbox" checked"checked"><div cl…

车载诊断架构---NRC 78和NRC 21那些你不知道的事情!

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【计算机基础——数据结构——红黑树】

1. 红黑树&#xff08;RBTree&#xff09; 为什么HashMap不直接使用AVL树&#xff0c;而是选择了红黑树呢&#xff1f; 由于AVL树必须保证左右子树平衡&#xff0c;Max(最大树高-最小树高) < 1&#xff0c;所以在插入的时候很容易出现不平衡的情况&#xff0c;一旦这样&…

linux物理内存管理:node,zone,page

一、总览 对于物理内存内存&#xff0c;linux对内存的组织逻辑从上到下依次是&#xff1a;node&#xff0c;zone&#xff0c;page&#xff0c;这些page是根据buddy分配算法组织的&#xff0c;看下面两张图&#xff1a; 上面的概念做下简单的介绍&#xff1a; Node&#xff1a…

CKA认证 | 使用kubeadm部署K8s集群(v1.26)

一、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; ① kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 ② 二进制包 从github下…

如何安装和配置JDK17

教程目录 零、引言1、新特性概览2、性能优化3、安全性增强4、其他改进5、总结 一、下载安装二、环境配置三、测试验证 零、引言 JDK 17&#xff08;Java Development Kit 17&#xff09;是Java平台的一个重要版本&#xff0c;它带来了许多新特性和改进&#xff0c;进一步提升了…

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步&#xff1a;市场趋势判断2.3.2 第二步&#xff1a;竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步&#xff1a;客户分析2.3.4 第四步&#xff1a;产品定义2.3.5 第五步&#xff1a;开发执…

一款革命性的视频剪辑工具,AI剪辑新纪元:Clapper

如果说AI视频剪辑工具哪家强&#xff1f;还真想不出有什么让人眼前一亮的AI视频剪辑应用。 毕竟随着AI技术的发展越来越快&#xff0c;各种AI应用如雨后春笋般涌现&#xff0c;然而&#xff0c;真正能够在视频剪辑领域脱颖而出的工具却寥寥无几。 今天我要介绍的 Clapper 就是…

递归函数学习 part1

一&#xff0c;初始递归&#xff1a;阶乘 1&#xff0c;原理 n的阶乘等于n乘以n-1的阶乘&#xff0c;而0的阶乘等于1. 2&#xff0c;代码展示 #include <iostream> using namespace std;int fact(int); int main() {cout<<fact(5);return 0; }int fact(int n) …

解决程序因缺少xinput1_3.dll无法运行的有效方法,有效修复丢失xinput1_3.dll

如果你的电脑在运行某些应用程序或游戏时提示“xinput1_3.dll丢失”或“找不到xinput1_3.dll”的错误消息&#xff0c;那么很可能是因为你的系统中缺少这个重要的DLL文件而导致的问题。那么电脑出现xinput1_3.dll丢失的问题时有哪些方法进行修复呢&#xff1f; 如何确定电脑是否…

深入了解区块链:Web3的基础架构与发展

在数字时代的浪潮中&#xff0c;区块链技术正逐渐成为Web3的重要基础&#xff0c;重新定义互联网的结构和用户体验。Web3不仅是一个全新的网络阶段&#xff0c;更代表了一种去中心化的理念&#xff0c;强调用户主权和数据隐私。本文将深入探讨区块链在Web3中的基础架构、技术特…

内核tracepoint的注册回调及添加的方法

一、背景 内核开发时往往需要做一些内核态函数的监测或者内核状态的监测&#xff0c;就需要用一些调试手段来观测。常用的内核态的观测如kprobe和tracepoint&#xff0c;但是kprobe往往受制于一些系统的限制&#xff0c;很多系统并没有打开kprobe选项&#xff0c;这样我们不能…

React融合css

单纯使用tsx文件生成的页面比较单一&#xff0c;可以考虑结合css进行使用&#xff0c;需要说明的是&#xff0c;本人水平有限&#xff0c;仅对接触过的几种方式进行说明 内联样式 内联样式也有多种写法&#xff0c;此处仅列举两种比较简单的写法 写法一 import React from …

【大数据学习 | kafka高级部分】kafka中的选举机制

controller的选举 首先第一个选举就是借助于zookeeper的controller的选举 第一个就是controller的选举&#xff0c;这个选举是借助于zookeeper的独享锁实现的&#xff0c;先启动的broker会在zookeeper的/contoller节点上面增加一个broker信息&#xff0c;谁创建成功了谁就是主…

【基于PSINS工具箱】以速度为观测量的SINS/GNSS组合导航,UKF滤波

基于【PSINS工具箱】&#xff0c;提供一个MATLAB例程&#xff0c;仅以速度为观测量的SINS/GNSS组合导航&#xff08;滤波方式为UKF&#xff09; 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码教程&#xff1a;使用UKF进行速度观测1. 引言与基本设置2. 初始设置3. U…

ThinkBook 14+ 2024 Ubuntu 触控板失效 驱动缺失问题解决

首先我的电脑是thinkbook14 2024&#xff0c;从ubuntu18到ubuntu24&#xff0c;笔者整个都试了一遍&#xff0c;触摸板都没反应&#xff0c;确认不是linux系统内核问题&#xff0c;原因为驱动缺失。 解决步骤&#xff1a; &#xff08;1&#xff09;下载驱动&#xff0c;网址如…

如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息

目录 前言一、什么是Web Scraper API二、Web Scraper API 的优势&#xff1a;三、Web Scraper API 适用场景四、实践案例目标需求视频讲解1、选择Web Scraper API2、登录注册3、进入用户控制面板4、选择API5、触发数据收集 API6、获取爬虫结果7、分析爬虫结果&#xff08;1&…