简要说明: 本人最近在学习Android的网络一节时,看到和JavaScript有关的知识时,就很想趁热打铁实现Echarts炫彩图表的Android本地展示,便在此处予以分享,有不足与错误之处请各位大佬指正。
- 主要的思路是参考:
- 大神 isea533的ECharts-Java使用Java快速开发ECharts图表
- 大神 _frendy的轻松实现 Android 图表 • ECharts,主要是实现他的第一种方式由 Android 获取数据并生成 option,而 H5 则负责解析 option 并调用 ECharts 进行绘制。不同之处在于此处使用的是 java 而非 kotlin
- 大神dwf_学海无涯的Android项目中使用echarts
相关类库下载
- ECharts-Java类库地址:http://git.oschina.net/free/ECharts
- 百度Echarts地址:http://echarts.baidu.com/
- Gson下载地址:https://mvnrepository.com/artifact/com.google.code.gson/gson
具体步骤
1. 生成模拟数据
注: 此处的数据仅仅是为了方便测试类库实现,读者可以根据不同的需求,采用不同的数据获取方式
- 此处我采用的是自己定义了数据类
AccessData,并且给出了相应的数据获取方法getWeekData(),具体的代码如下所示:
//数据对象
public class AccessData {
//日期
private String date;
//访问量
private Integer nums;
// 构造函数
AccessData(String date, Integer nums) {
...
}
// getter,setter方法
...
/**
* 模拟获取数据
* @return 此处可按照自定义的数据类型
*/
public static List<AccessData> getWeekData() {
List<AccessData> list = new ArrayList<AccessData>(7);
list.add(new AccessData("09-16", 4));
list.add(new AccessData("09-17", 7));
list.add(new AccessData("09-18", 14));
list.add(new AccessData("09-19", 304));
list.add(new AccessData("09-20", 66));
list.add(new AccessData("09-21", 16));
list.add(new AccessData("09-22", 205));
return list;
}
2. 利用大神的Echarts-Java类库,绘制线图
- 此处,我定义了myLineChart类,用于生成对应的Echarts Line图对应的的Option选项,并返回为JSON,字符串,该类中的部分方法采用
@JavascriptInterface修饰,以方便xx.html中的JavaScript块调用该option,代码如下:
public class myLineChart {
Context mContext;
// 用户数据的数据结构,可后面自己定义
List<AccessData> lineDatas;
/**
* 构造函数
* @param context
* @param datas:利用构造函数传入用户的数据
*/
public myLineChart(Context context, List<AccessData> datas) {
this.mContext = context;
// 获取数据
this.lineDatas = datas;
}
// 将该方法暴露给JavaScript脚本调用
@JavascriptInterface
public String getLineChartOptions() {
GsonOption option = (GsonOption) creatLineChartOptions();
// Log.d(option.toString());
return option.toString();
}
// 此函数主要是绘 Line 图
@JavascriptInterface
public Option creatLineChartOptions() {
// 创建Option对象
GsonOption option = new GsonOption();
// 设置图标标题,并且居中显示
option.title().text("最近7天的访问量").x(X.center);
// 设置图例,居中显示
option.legend().data("访问量").x(X.center).y(Y.bottom).borderWidth(1);
// 设置y轴为值轴,并且不显示y轴,最大值设置400,最小值-100
option.yAxis(new ValueAxis()
.name("IP")
.axisLine(new AxisLine()
.show(true)
.lineStyle(new LineStyle().width(0)))
.max(400)
.min(-100));
// 创建类目轴,并且不显示竖着的分割线
CategoryAxis categoryAxis = new CategoryAxis()
.splitLine(new SplitLine().show(false))
.axisLine(new AxisLine().onZero(false));
// 不显示表格边框,就是围着图标的方框
option.grid().borderWidth(0);
// 创建Line数据
// 此处开始使用用户的数据
Line line = new Line("访问量").smooth(true);
// 根据获取的数据赋值
for (AccessData lineData : lineDatas) {
// 增加类目,值为日期
categoryAxis.data(lineData.getDate());
// 日期对应的数据
line.data(lineData.getNums());
}
// 设置X轴为类目轴
option.xAxis(categoryAxis);
// 设置数据
option.series(line);
return option;
}
-
注,该段代码需要import
Echarts-java类库相关API,使用该类库的方法如下:-
方法一:本地下载类库
- 下载ECharts:3.0.0.6类库和Gson:2.8.x到本地
...\xxxxDemo\app\libs - 在Android Studio下面的
Project页面,找到该...\xxxxDemo\app\libs下的**.jar**文件,右键点击Add As Library - 在工程
Gradle Scripts下的build.gradle,双击打开查看是否在dependencies{...}里面生成,如果不成功请手动编辑,最后如下所示:
dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation files('libs/ECharts-3.0.0.6.jar') implementation files('libs/gson-2.8.0.jar') ... }具体位置可查看下图:
- 下载ECharts:3.0.0.6类库和Gson:2.8.x到本地
-
-
方法二:直接在在工程
Gradle Scripts下的build.gradle,双击打开在dependencies{...}里面编辑dependencies { ... implementation 'com.github.abel533:ECharts:3.0.0.6' implementation 'com.google.code.gson:gson:2.8.0' ... } -
在导入库成功后,便可以在myLineChart类中采用:
import com.github.abel533.echarts.Option; import com.github.abel533.echarts.axis.AxisLine; import com.github.abel533.echarts.axis.CategoryAxis; import com.github.abel533.echarts.axis.SplitLine; import com.github.abel533.echarts.axis.ValueAxis; import com.github.abel533.echarts.code.X; import com.github.abel533.echarts.code.Y; import com.github.abel533.echarts.json.GsonOption; import com.github.abel533.echarts.series.Line; import com.github.abel533.echarts.style.LineStyle;
3. 在MainActivity.java,配置WebView,加载对应的.html
注: 在MainActivity对应的activity_main.xml,仅单纯的存在一个WebView组件,此处不再展示。
MainActivity.java代码如下所示:
public class MainActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView)findViewById(R.id.webView);
// 获取指定数据格式的数据,此处可以和外部交互
List<AccessData> datas = getWeekData();
// 进行WebView设置
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportZoom(true);
webSettings.setDisplayZoomControls(true);
// 给JavaScript传递生成的myLineChart的Option
webView.addJavascriptInterface(new myLineChart(this,datas), "myLine");
webView.loadUrl("file:///android_asset/myechart.html");
webView.setWebViewClient(new WebViewClient());
}
}
4. 编辑myechart.html页面,进行Echarts配置,绘图
-
引入
echarts.common.min.js - 为 ECharts 准备一个具备大小(宽高)的 DOM
- 获取Java代码生成的option
- JOSN.parse 转换josn字符串类型数据为JavaScript对象
-
进行绘图
如下面的详细代码:
<head>
<meta charset="utf-8" />
<style>
<!-- Css 样式-->
...
</style>
</head>
<!-- ECharts单文件引入 -->
<script src="js/echarts.common.min.js"></script>
<body>
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="main" style="float: center; width: '100%';height: 380px; margin-left: '2%';margin-bottom: 35px"></div>
<script type="text/javascript">
// 图表的加载区域
var dom = document.getElementById('main');
var myChart = echarts.init(dom);
// 必须加JOSN.parse 转换数据类型
var option = JSON.parse(myLine.getLineChartOptions());
// 查询
function loadChart() {
myChart.clear();
myChart.showLoading({
text: '正在努力的读取数据中...'
});
myChart.setOption(option);
myChart.hideLoading();
};
// 载入图表
loadChart();
</script>
</body>
5. 项目结构和安装演示
项目结构
演示效果
6. 本人项目地址
EchartDemo2
EchartDemo1:采用的是直接JavaScript代码生成,主要是H5 负责所有流程,获取数据、生成 option并调用 ECharts 进行绘制
本人的AndroidApp项目,有学习兴趣的可以一起交流,主要参考的是疯狂Android第三版的代码