推荐你几个相关开源项目,可以根据需要自己选择,自己画还是比较麻烦的:MPAndroidChart强大的图表绘制工具,支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、网状图及各种图的结合;支持图的拖拽缩放;支持Android2.2以上,支持横纵轴缩放,多指缩放,展现动画、高亮、保存到sdcard、从文件读取图表achartengine强大的图表绘制工具,支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、拨号图/表、立方线图及各种图的结合GraphView绘制图表和曲线图的View,可用于Android上的曲形图、柱状图、波浪图展示HoloGraphLibrary绘制线状图、柱状图、饼状图XCL-ChartsXCL-Charts基于原生的Canvas来绘制各种图表,在设计时,尽量在保证开发效率的同时,给使用者提供足够多的定制化能力。因此使用简便,同时具有相当灵活的定制能力。目前支持3D/非3D柱形图(BarChart)、3D/非3D饼图(PieChart)、堆积图(StackedBarChart)、面积图(AreaChart)、折线图(LineChart)、曲线图(SplineChart)、环形图(DountChart)、南丁格尔玫瑰图(RoseChart)、仪表盘(DialChart)、刻度盘(GaugeChart)、雷达图(RadarChart)、圆形图(CircleChart)等图表。其它特性还包括支持图表缩放、手势移动、动画显示效果、高密度柱形显示、图表分界定制线、多图表的混合显示及同数据源不同类型图表切换等。EazeGraphAndroid图表库,支持柱状图、分层柱状图、饼状图、线性图WilliamChart绘制图表的库,支持LineChartView、BarChartView和StackBarChartView三中图表类型,并且支持Android2.2及以上的系统。HelloChartsforAndroid支持折线图、柱状图、饼图、气泡图、组合图;支持预览、放大缩小,滚动,部分图表支持动画;支持Android2.2以上这些项目都可以在GitHub搜索到。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都做网站、外贸网站建设、伊通网络推广、成都小程序开发、伊通网络营销、伊通企业策划、伊通品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供伊通建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
android 中已经有非常优秀的图表库如MPAndroidChart,hellocharts。这些图表库功能强大,支持图表类型多。最近笔者公司只有一个很简单的图表需求,只需要做一个折线图,用这些库的话,完全可以实现但是导入,实现麻烦,而且会增大包体积。如是就想到了写一个轻量级的图表框架AndroidLightCharts,只包含几个最基本,最常用的charts。
demo 及源码地址:
折线图:
饼状图:
目前只包含上面三种chart,使用起来非常简单。其中LineView表示折线图,PieView 表示饼状图,BarView表示柱状图。
每种类型的chart可配置的项如下:
WebView是android中一个非常实用的组件,它和safai、chrome一样都是基于webkit网页渲染引擎,可以通过加载html数据的方式便捷地展现软件界面,WebView主要负责解析、渲染。webview的常见工具类和用法如下:
先在js中定义要被调用方法:
```javascript
function initChartView() {}
```
在安卓中的类EChartWebView注册js方法:
```java
fun initChartView(){
Log.i("initChartView():",""+loadUrl("javascript:initChartView()"))
}
```
javascriptInterface、webViewClient.shouldOverrideUrlLoading()、webChromeClient.onconsoleMessage()、webChromeClient.onJspompt()
具体使用在后面叙述
(参考: isea533的ECharts-Java使用Java快速开发ECharts图表 和 _frendy的轻松实现 Android 图表 • ECharts)
由于eacharts 里各种图表的属性和数据等都是由 option ,使用 WebView 加载H5网页有两种思路:
1)由 Android 获取数据并生成 option,而 H5 则负责解析 option 并调用 ECharts 进行绘制。
2)H5 负责所有流程,获取数据、生成 option并调用 ECharts 进行绘制。
在此使用第 1)种方法,具体实现如下:
```java
implementation'com.github.frendyxzc:Charts:0.0.2'
implementation'com.github.abel533:ECharts:2.2.7'
```
--- loadUrl(URL):加载http网页的方法
--- webSettings :与webview相关的配置
--- addJavascriptInterface :提供js调用java的相关方法
--- setDataSource : 对java构建完成的option进行返回
在com.github.abel533.echarts.Option中已提供了与Echarts实现的各种配置,我们只需调用即可
tooltip():与标签有关
grid():刻度线
CategoryAxis():建立横向类目轴
ValueAxis():纵轴
MarkPoint():点数据
MarkLine():标线
图表数据填充:
数据填充Echarts的XY轴的两种方法
(1)for in 循环方式
```java
for (item in ArraylistE) {
categoryAxis.data(item.x)
line.data(item.y)
}
```
(2)Kotlin的变长参数
```java
categoryAxis.data(*dataArrayX)
line.data(*dataArrayY)
```
注:此处的dataArrayX和dataArrayY是任意类型的数组
*建立完成后选择展示的图表类型(线型图表)*:
```java
option.exportToHtml("line.html")
```
注:line.html和js等文件放置在安卓assets文件中
安卓端的数据就是option,option是构建的json字符串
在安卓端获取数据并构建被js调用的方法:
```java
addJavascriptInterface(EChartInterface(context), "Android")
```
定义一个接口供数据回调:
```java
private var dataSource: DataSource? = null
fun setDataSource(data: EChartWebView.DataSource, needReload: Boolean) {
dataSource = data
}
interface DataSource {
fun markChartOptions(): GsonOption
}
```
接口里方法的定义:
```java
internal inner class EChartInterface(var context: Context) {
val chartOptions: String?
@JavascriptInterface
get() {
if (dataSource != null) {
val option = dataSource!!.markChartOptions()
Log.i("xq","echarts图表的option:$option")
return option.toString()
}
return null
}
}
```
在js页面调用安卓的方法
```java
option = JSON.parse(Android.getChartOptions());
JSON.parse是将json字符串其转化为json对象
```
其中Android.getChartOptions()就是js调用安卓的方法
初始化Echarts图标并设置option ,实现如下:
```java
chart = echarts.init(chartDoc);
chart.setOption(option);
```
介绍:formatter用于规定echarts数据显示的内容和格式。
使用:
饼图模板变量:
(1){a}:系列名,series.name。
(2){b}:数据名,series.data.name。
(3){c}:数据值,series.data.value。
(4){d}:百分比。
(5){@xxx}:数据中名为'xxx'的维度的值,如{@product}表示名为'product'` 的维度的值。
(6){@[n]}:数据中维度n的值,如{@[3]}` 表示维度 3 的值,从 0 开始计数。
示例:
formatter:"{b}:{c}({d}%)"
折线、柱状图模板变量:
(1){a}:系列名,series.name。
(2){b}:数据名,xAxis.data。
(3){c}:数据值,yAxis.data。
(5){@xxx}:数据中名为'xxx'的维度的值,如{@product}表示名为'product'` 的维度的值。
(6){@[n]}:数据中维度n的值,如{@[3]}` 表示维度 3 的值,从 0 开始计数。
示例:
formatter:"{a}br/{b}:{c}"
此方法需要自行拼接要显示的标签内容,可以灵活配置比如有些图表option的配置在类库 abel533:ECharts:2.2.7 中是没有的,自定义formatter内容需要知道参数具体表示的内容,这里可以通过js的打印打印出函数传入的参数值,使用函数返回params对象,params是点数据的对象集合,打印出它的内容即可知道每个参数具体代表什么。
示例:
formatter:function(params){
console.log(params)
var result = params[0].name
for(i=0;iparams.length;i++){
result = result+"br"+"span style=display:inline-block;margin-right:5px;border-radius:10px;width:8px;height:8px;background-color:"+params[i].color+"/span"+params[i].seriesName+": "+params[i].value
}
return result
}
主要思路是:
1. 把数据库分解成几个asset文件。
2. 当需要打开数据库时,如果数据库不存在,就把那几个asset文件重新合并成一个数据库文件。
3. 如果数据库的版本改变了,就在onUpgrade()方法中把数据库文件删除掉。
下面是代码:
//数据库的缺省路径
private static finalString DB_PATH = "/data/data/com.mypackage.myapp/databases/";
private static finalString DB_NAME = "mydb.db";
private static finalint DB_VERSION = 2;
private static finalString DB_SPLIT_NAME = "mydb.db.00";
private static finalint DB_SPLIT_COUNT = 3;
private SQLiteDatabasem_database;
private final Contextm_context;
/**
* Constructor
*保存传进来的context参数以用来访问应用的asset和资源文件。
* @param context
*/
public MyDB(Contextcontext) {
super(context, DB_NAME, null, DB_VERSION);
this.m_context = context;
}
public static MyDBopenDatabaseReadOnly(Context context) {
MyDB db = new MyDB(context);
try {
db.createDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
db.openDataBase(SQLiteDatabase.OPEN_READONLY);
return db;
}
public static MyDBopenDatabaseReadWrite(Context context) {
MyDB db = new MyDB(context);
try {
db.createDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
db.openDataBase(SQLiteDatabase.OPEN_READWRITE);
return db;
}
/**
*创建一个空数据库,用来存储你已有的数据库。
*/
public voidcreateDataBase() throws IOException{
boolean dbExist =checkDataBase();
if (dbExist) {
/*
**如果你的数据库的版本改变了,调用这个方法确保在onUpgrade()被调用时
**传进去的是可写的数据库。
目前android上图标引擎并不少见,像aChartEngine就能很好的完成绘图:
aChartEngine支持:1、line chart (折线图) 2、area chart (面积图;分区图,对比图) 3、scatter chart ( 散点图) 4、time chart (时间图;进度表) 5、bar chart (条形图;柱状图) 6、pie chart ( 饼图) 7、bubble chart (气泡图) 8、doughnut chart (圆环图) 9、range (high-low) bar chart (范围条形图) 10、dial chart / gauge (拨号盘/压力表) 11、combined (any combination of line, cubic line, scatter, bar, range bar, bubble) chart(组合图) 12、cubic line chart (立方折线图)
上述所有支持的图表类型,都可以包含多个系列,都支持水平(默认)或垂直方式展示图表,并且支持许多其他的自定义功能。所有图表都可以建立为一个view,也可以建立为一个用于启动activity的intent.
下面是一个饼状图的源码事例:
package org.achartengine.chartdemo.demo.chart;
import org.achartengine.ChartFactory;
import org.achartengine.renderer.DefaultRenderer;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
public class BudgetPieChart extends AbstractDemoChart {
public String getName() {
return "Budget chart";
}
public String getDesc() {
return "The budget per project for this year (pie chart)";
}
public Intent execute(Context context) {
double[] values = new double[] { 12, 14, 11, 10, 19 };//饼图分层5块,每块代表的数值
int[] colors = new int[] { Color.BLUE, Color.GREEN, Color.MAGENTA, Color.YELLOW, Color.CYAN };//每块饼图的颜色
DefaultRenderer renderer = buildCategoryRenderer(colors);
renderer.setZoomButtonsVisible(true);//设置显示放大缩小按钮
renderer.setZoomEnabled(true);//设置允许放大缩小.
renderer.setChartTitleTextSize(20);//设置图表标题的文字大小
return ChartFactory.getPieChartIntent(context, buildCategoryDataset("Project budget", values),
renderer, "Budget");//构建Intent, buildCategoryDataset是调用AbstraDemoChart的构建方法.
}
}