如何用JavaScript获取WebViewString并用ECharts的库绘制折线图?

JavaScript019

如何用JavaScript获取WebViewString并用ECharts的库绘制折线图?,第1张

做金融类型的应用经常会用到数据的统计报表 诸如折线图 ,  K线图, 饼状图,柱状图  既能形象的表述数据的分布 , 同时又增加了数据的可读性

实现思路: 百度Echarts支持安卓移动端的运用 , WebView加载html, 嵌套JavaScript代码 , 即可动态实现在线图表的展示功能..

下面展示下今天要实现的效果

进入Echarts官网下载页 可以选择自己需要的图表类型 自定义下载js文件 , 精简版,常用版, 完整版 根据需求自定义下载

导入刚下载的图表构建工具   echarts.min.js  到安卓项目的 资产目录(assets)下 这里我使用的 完整版

创建 Htm l文件 , 即要展示的网页 ,  文件名自定义 这里我是 myechart.html

我的assets目录结构如下:

接下来就是html文件的代码了 首先我们为ECharts准备一个具备大小(宽高) 的 DOM 并取别名

<div id="main" style="float: leftwidth: 600pxheight:500pxmargin-top: 20px"></div>

导入图表构建工具

<script src="js/echarts.min.js"></script>

因为我这里要展示多种类型的图表 所以定义了几个方法  下面以折线图为例

var lineJson//用于临时存储折线图json对象, 便于追加数据

//创建折线图

function createLineChart(obj){

lineJson=obj

options = {

title : {

//text: '脉搏值(次/min)',

text: obj.title,

subtext: 'make by sxt',

x:'left'

},

tooltip: {

trigger: 'axis',

formatter: "脉搏频率 : <br/>{b} - {c} 次/min"

},

xAxis: {

id: 'dataX',

type: 'category',

splitLine:{

show:true

},

axisLabel: {

//formatter: '{value} °C'

formatter: '{value}'

},

data: obj.times //动态展示运动时间

},

yAxis: {

type: 'value',

axisLine: {onZero: true},

splitLine:{

show:true

},

axisLabel: {

//formatter: '{value} km'

formatter: '{value}'

},

min:0,

max:150//在此设置范围

},

dataZoom: [

{

id:'dataZoom',

show:false,

type: 'inside',//inside 为拖动效果

//type: 'slider',//slider为手动更新效果

realtime: true,

filterMode: 'filter',

start: 20,

end: 85,

xAxisIndex: 0

}

],

series: [{

id: 'dataY',

name: '脉搏频率(次)/(s)',

type: 'line',

smooth: true,

data: obj.steps, //动态展示运动步数数据

lineStyle: {

normal: {

width: 3,

shadowColor: 'rgba(0,0,0,0.4)',

shadowBlur: 10,

shadowOffsetY: 10

}

},

markPoint : {//标注点

data : [//这种方式内部自动计算最值

{

type :'max'  ,

name:'最大值' ,

symbol:'image://' + treeUrl,

symbolSize: [30, 30]

},

{

type : 'min',

name: '最小值',

symbol:'image://' + childUrl,

symbolSize: [30, 30]

}

]

},

markLine : {

data : [ {type : 'average', name: '平均值'} ]

}

}]

}

}

//更新折线图的缩放起始位置

function updateZoomState(start,end){

myChart.setOption({

dataZoom: [{

id: 'dataZoom',

start: start,

end: end

}]

})

}

//获取数组最小值

function getMinValue(obj){

var min = obj.steps[0]

for (var i = 1i <obj.steps.lengthi++){

if (obj.steps[i] <min){

min = obj.steps[i]

}

}

return min

}

//获取数组最大值

function getMaxValue(obj){

var max = obj.steps[0]

for (var i = 1i <obj.steps.lengthi++){

if (obj.steps[i] >max) {

max = obj.steps[i]

}

}

return max

}

//更新折线图数据 继续在后面追加数据

function updateDataXY(dataX,dataY){

myChart.setOption({

xAxis: {

id: 'dataX',

data:lineJson.times.concat(dataX)

},

series:[{

id: 'dataY',

data:lineJson.steps.concat(dataY)

}],

dataZoom: [{

id: 'dataZoom',

start: 60,

end: 100

}]

})

}

展示图表

//显示图表

function createChart(type,json){

if(type=='line'){

createLineChart(json)

}

if(type=='bar'){

createBarChart(json)

}

if(type=='pie'){

createPieChart(json)

}

if(type=='more'){

createMoreChart()

}

// 基于准备好的dom,初始化echarts实例

myChart = echarts.init(document.getElementById('main'))

//使用指定的配置项和数据显示图表。

myChart.setOption(options)

}

D3是目前最流行的JavaScript可视化图表库之一,D3的图表类型非常丰富,并且支持SVG格式,因此应用十分广泛,也有很多图表插件基于D3开发,比如MetricsGraphics.js,在D3上构建的数据图表非常强大。

D3的特点

允许绑定任意数据到DOM,将数据驱动转换应用到Document中。

不仅可以创建精美的HTML表格,而且可以绘制折线图、柱形图和饼图等数据图表。

支持SVG,在Web页面上渲染毫无压力。

回到顶部

D3的使用方法

关于D3的具体用法,可以看D3图形库API参考这篇文章。本文主要对介绍一些经典图表的实现效果及代码。

index.html代码:

<!DOCTYPE html>

<meta charset="utf-8">

<style>

 

svg {

  font: 10px sans-serif

}

 

.y.axis path {

  display: none

}

 

.y.axis line {

  stroke: #fff

  stroke-opacity: .2

  shape-rendering: crispEdges

}

 

.y.axis .zero line {

  stroke: #000

  stroke-opacity: 1

}

 

.title {

  font: 300 78px Helvetica Neue

  fill: #666

}

 

.birthyear,

.age {

  text-anchor: middle

}

 

.birthyear {

  fill: #fff

}

 

rect {

  fill-opacity: .6

  fill: #e377c2

}

 

rect:first-child {

  fill: #1f77b4

}

 

</style>

<body>

<script src="http://d3js.org/d3.v3.min.js"></script>

<script>

 

var margin = {top: 20, right: 40, bottom: 30, left: 20},

    width = 960 - margin.left - margin.right,

    height = 500 - margin.top - margin.bottom,

    barWidth = Math.floor(width / 19) - 1

 

var x = d3.scale.linear()

    .range([barWidth / 2, width - barWidth / 2])

 

var y = d3.scale.linear()

    .range([height, 0])

 

var yAxis = d3.svg.axis()

    .scale(y)

    .orient("right")

    .tickSize(-width)

    .tickFormat(function(d) { return Math.round(d / 1e6) + "M" })

 

// An SVG element with a bottom-right origin.

var svg = d3.select("body").append("svg")

    .attr("width", width + margin.left + margin.right)

    .attr("height", height + margin.top + margin.bottom)

  .append("g")

    .attr("transform", "translate(" + margin.left + "," + margin.top + ")")

 

// A sliding container to hold the bars by birthyear.

var birthyears = svg.append("g")

    .attr("class", "birthyears")

 

// A label for the current year.

var title = svg.append("text")

    .attr("class", "title")

    .attr("dy", ".71em")

    .text(2000)

 

d3.csv("population.csv", function(error, data) {

 

  // Convert strings to numbers.

  data.forEach(function(d) {

    d.people = +d.people

    d.year = +d.year

    d.age = +d.age

  })

 

  // Compute the extent of the data set in age and years.

  var age1 = d3.max(data, function(d) { return d.age }),

      year0 = d3.min(data, function(d) { return d.year }),

      year1 = d3.max(data, function(d) { return d.year }),

      year = year1

 

  // Update the scale domains.

  x.domain([year1 - age1, year1])

  y.domain([0, d3.max(data, function(d) { return d.people })])

 

  // Produce a map from year and birthyear to [male, female].

  data = d3.nest()

      .key(function(d) { return d.year })

      .key(function(d) { return d.year - d.age })

      .rollup(function(v) { return v.map(function(d) { return d.people }) })

      .map(data)

 

  // Add an axis to show the population values.

  svg.append("g")

      .attr("class", "y axis")

      .attr("transform", "translate(" + width + ",0)")

      .call(yAxis)

    .selectAll("g")

    .filter(function(value) { return !value })

      .classed("zero", true)

 

  // Add labeled rects for each birthyear (so that no enter or exit is required).

  var birthyear = birthyears.selectAll(".birthyear")

      .data(d3.range(year0 - age1, year1 + 1, 5))

    .enter().append("g")

      .attr("class", "birthyear")

      .attr("transform", function(birthyear) { return "translate(" + x(birthyear) + ",0)" })

 

  birthyear.selectAll("rect")

      .data(function(birthyear) { return data[year][birthyear] || [0, 0] })

    .enter().append("rect")

      .attr("x", -barWidth / 2)

      .attr("width", barWidth)

      .attr("y", y)

      .attr("height", function(value) { return height - y(value) })

 

  // Add labels to show birthyear.

  birthyear.append("text")

      .attr("y", height - 4)

      .text(function(birthyear) { return birthyear })

 

  // Add labels to show age (separate not animated).

  svg.selectAll(".age")

      .data(d3.range(0, age1 + 1, 5))

    .enter().append("text")

      .attr("class", "age")

      .attr("x", function(age) { return x(year - age) })

      .attr("y", height + 4)

      .attr("dy", ".71em")

      .text(function(age) { return age })

 

  // Allow the arrow keys to change the displayed year.

  window.focus()

  d3.select(window).on("keydown", function() {

    switch (d3.event.keyCode) {

      case 37: year = Math.max(year0, year - 10) break

      case 39: year = Math.min(year1, year + 10) break

    }

    update()

  })

 

  function update() {

    if (!(year in data)) return

    title.text(year)

 

    birthyears.transition()

        .duration(750)

        .attr("transform", "translate(" + (x(year1) - x(year)) + ",0)")

 

    birthyear.selectAll("rect")

        .data(function(birthyear) { return data[year][birthyear] || [0, 0] })

      .transition()

        .duration(750)

        .attr("y", y)

        .attr("height", function(value) { return height - y(value) })

  }

})