WebView是android中一個非常實用的組件,它和safai、chrome一樣都是基于webkit網(wǎng)頁渲染引擎,可以通過加載html數(shù)據(jù)的方式便捷地展現(xiàn)軟件界面,WebView主要負(fù)責(zé)解析、渲染。webview的常見工具類和用法如下:
成都創(chuàng)新互聯(lián)公司成立以來不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點,以客戶需求中心、市場為導(dǎo)向”的快速反應(yīng)體系。對公司的主營項目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計、行業(yè) / 企業(yè)門戶設(shè)計推廣、行業(yè)門戶平臺運(yùn)營、成都App定制開發(fā)、成都手機(jī)網(wǎng)站制作、微信網(wǎng)站制作、軟件開發(fā)、綿陽服務(wù)器托管等實行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從成都創(chuàng)新互聯(lián)公司可以獲得的服務(wù)效果。
先在js中定義要被調(diào)用方法:
```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快速開發(fā)ECharts圖表? 和? _frendy的輕松實現(xiàn) Android 圖表 ? ECharts)
由于eacharts 里各種圖表的屬性和數(shù)據(jù)等都是由 option ,使用 WebView 加載H5網(wǎng)頁有兩種思路:
1)由 Android 獲取數(shù)據(jù)并生成 option,而 H5 則負(fù)責(zé)解析 option 并調(diào)用 ECharts 進(jìn)行繪制。
2)H5 負(fù)責(zé)所有流程,獲取數(shù)據(jù)、生成 option并調(diào)用 ECharts 進(jìn)行繪制。
在此使用第 1)種方法,具體實現(xiàn)如下:
```java
implementation'com.github.frendyxzc:Charts:0.0.2'
implementation'com.github.abel533:ECharts:2.2.7'
```
--- loadUrl(URL):加載http網(wǎng)頁的方法
--- webSettings :與webview相關(guān)的配置
--- addJavascriptInterface :提供js調(diào)用java的相關(guān)方法
--- setDataSource : 對java構(gòu)建完成的option進(jìn)行返回
在com.github.abel533.echarts.Option中已提供了與Echarts實現(xiàn)的各種配置,我們只需調(diào)用即可
tooltip():與標(biāo)簽有關(guān)
grid():刻度線
CategoryAxis():建立橫向類目軸
ValueAxis():縱軸
MarkPoint():點數(shù)據(jù)
MarkLine():標(biāo)線
圖表數(shù)據(jù)填充:
數(shù)據(jù)填充Echarts的XY軸的兩種方法
(1)for in 循環(huán)方式
```java
for (item? in? ArraylistE) {
categoryAxis.data(item.x)
line.data(item.y)
}
```
(2)Kotlin的變長參數(shù)
```java
categoryAxis.data(*dataArrayX)
line.data(*dataArrayY)
```
注:此處的dataArrayX和dataArrayY是任意類型的數(shù)組
*建立完成后選擇展示的圖表類型(線型圖表)*:
```java
option.exportToHtml("line.html")
```
注:line.html和js等文件放置在安卓assets文件中
安卓端的數(shù)據(jù)就是option,option是構(gòu)建的json字符串
在安卓端獲取數(shù)據(jù)并構(gòu)建被js調(diào)用的方法:
```java
addJavascriptInterface(EChartInterface(context), "Android")
```
定義一個接口供數(shù)據(jù)回調(diào):
```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頁面調(diào)用安卓的方法
```java
option = JSON.parse(Android.getChartOptions());
JSON.parse是將json字符串其轉(zhuǎn)化為json對象
```
其中Android.getChartOptions()就是js調(diào)用安卓的方法
初始化Echarts圖標(biāo)并設(shè)置option ,實現(xiàn)如下:
```java
chart = echarts.init(chartDoc);
chart.setOption(option);
```
介紹:formatter用于規(guī)定echarts數(shù)據(jù)顯示的內(nèi)容和格式。
使用:
餅圖模板變量:
(1){a}:系列名,series.name。
(2):數(shù)據(jù)名,series.data.name。
(3){c}:數(shù)據(jù)值,series.data.value。
(4)lqne2jb:百分比。
(5){@xxx}:數(shù)據(jù)中名為'xxx'的維度的值,如{@product}表示名為'product'` 的維度的值。
(6){@[n]}:數(shù)據(jù)中維度n的值,如{@[3]}` 表示維度 3 的值,從 0 開始計數(shù)。
示例:
formatter:":{c}(reghcbi%)"
折線、柱狀圖模板變量:
(1){a}:系列名,series.name。
(2):數(shù)據(jù)名,xAxis.data。
(3){c}:數(shù)據(jù)值,yAxis.data。
(5){@xxx}:數(shù)據(jù)中名為'xxx'的維度的值,如{@product}表示名為'product'` 的維度的值。
(6){@[n]}:數(shù)據(jù)中維度n的值,如{@[3]}` 表示維度 3 的值,從 0 開始計數(shù)。
示例:
formatter:"{a}br/:{c}"
此方法需要自行拼接要顯示的標(biāo)簽內(nèi)容,可以靈活配置比如有些圖表option的配置在類庫 abel533:ECharts:2.2.7 中是沒有的,自定義formatter內(nèi)容需要知道參數(shù)具體表示的內(nèi)容,這里可以通過js的打印打印出函數(shù)傳入的參數(shù)值,使用函數(shù)返回params對象,params是點數(shù)據(jù)的對象集合,打印出它的內(nèi)容即可知道每個參數(shù)具體代表什么。
示例:
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. 把數(shù)據(jù)庫分解成幾個asset文件。
2. 當(dāng)需要打開數(shù)據(jù)庫時,如果數(shù)據(jù)庫不存在,就把那幾個asset文件重新合并成一個數(shù)據(jù)庫文件。
3. 如果數(shù)據(jù)庫的版本改變了,就在onUpgrade()方法中把數(shù)據(jù)庫文件刪除掉。
下面是代碼:
//數(shù)據(jù)庫的缺省路徑
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
*保存?zhèn)鬟M(jìn)來的context參數(shù)以用來訪問應(yīng)用的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;
}
/**
*創(chuàng)建一個空數(shù)據(jù)庫,用來存儲你已有的數(shù)據(jù)庫。
*/
public voidcreateDataBase() throws IOException{
boolean dbExist =checkDataBase();
if (dbExist) {
/*
**如果你的數(shù)據(jù)庫的版本改變了,調(diào)用這個方法確保在onUpgrade()被調(diào)用時
**傳進(jìn)去的是可寫的數(shù)據(jù)庫。
推薦MPChartLib
也可以自定義view,自己畫一個,第三方的有時太受限制
android 中已經(jīng)有非常優(yōu)秀的圖表庫如MPAndroidChart,hellocharts。這些圖表庫功能強(qiáng)大,支持圖表類型多。最近筆者公司只有一個很簡單的圖表需求,只需要做一個折線圖,用這些庫的話,完全可以實現(xiàn)但是導(dǎo)入,實現(xiàn)麻煩,而且會增大包體積。如是就想到了寫一個輕量級的圖表框架AndroidLightCharts,只包含幾個最基本,最常用的charts。
demo 及源碼地址:
折線圖:
餅狀圖:
目前只包含上面三種chart,使用起來非常簡單。其中LineView表示折線圖,PieView 表示餅狀圖,BarView表示柱狀圖。
每種類型的chart可配置的項如下:
目前android上圖標(biāo)引擎并不少見,像aChartEngine就能很好的完成繪圖:
aChartEngine支持:1、line?chart?(折線圖)?2、area?chart?(面積圖;分區(qū)圖,對比圖)?3、scatter?chart?(?散點圖)?4、time?chart?(時間圖;進(jìn)度表)?5、bar?chart?(條形圖;柱狀圖)?6、pie?chart?(?餅圖)?7、bubble?chart?(氣泡圖)?8、doughnut?chart?(圓環(huán)圖)?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?(立方折線圖)
上述所有支持的圖表類型,都可以包含多個系列,都支持水平(默認(rèn))或垂直方式展示圖表,并且支持許多其他的自定義功能。所有圖表都可以建立為一個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塊,每塊代表的數(shù)值
int[] colors = new int[] { Color.BLUE, Color.GREEN, Color.MAGENTA, Color.YELLOW, Color.CYAN };//每塊餅圖的顏色
DefaultRenderer renderer = buildCategoryRenderer(colors);
renderer.setZoomButtonsVisible(true);//設(shè)置顯示放大縮小按鈕
renderer.setZoomEnabled(true);//設(shè)置允許放大縮小.
renderer.setChartTitleTextSize(20);//設(shè)置圖表標(biāo)題的文字大小
return ChartFactory.getPieChartIntent(context, buildCategoryDataset("Project budget", values),
? renderer, "Budget");//構(gòu)建Intent, buildCategoryDataset是調(diào)用AbstraDemoChart的構(gòu)建方法.
}
}
推薦你幾個相關(guān)開源項目,可以根據(jù)需要自己選擇,自己畫還是比較麻煩的:MPAndroidChart強(qiáng)大的圖表繪制工具,支持折線圖、面積圖、散點圖、時間圖、柱狀圖、條圖、餅圖、氣泡圖、圓環(huán)圖、范圍(高至低)條形圖、網(wǎng)狀圖及各種圖的結(jié)合;支持圖的拖拽縮放;支持Android2.2以上,支持橫縱軸縮放,多指縮放,展現(xiàn)動畫、高亮、保存到sdcard、從文件讀取圖表achartengine強(qiáng)大的圖表繪制工具,支持折線圖、面積圖、散點圖、時間圖、柱狀圖、條圖、餅圖、氣泡圖、圓環(huán)圖、范圍(高至低)條形圖、撥號圖/表、立方線圖及各種圖的結(jié)合GraphView繪制圖表和曲線圖的View,可用于Android上的曲形圖、柱狀圖、波浪圖展示HoloGraphLibrary繪制線狀圖、柱狀圖、餅狀圖XCL-ChartsXCL-Charts基于原生的Canvas來繪制各種圖表,在設(shè)計時,盡量在保證開發(fā)效率的同時,給使用者提供足夠多的定制化能力。因此使用簡便,同時具有相當(dāng)靈活的定制能力。目前支持3D/非3D柱形圖(BarChart)、3D/非3D餅圖(PieChart)、堆積圖(StackedBarChart)、面積圖(AreaChart)、折線圖(LineChart)、曲線圖(SplineChart)、環(huán)形圖(DountChart)、南丁格爾玫瑰圖(RoseChart)、儀表盤(DialChart)、刻度盤(GaugeChart)、雷達(dá)圖(RadarChart)、圓形圖(CircleChart)等圖表。其它特性還包括支持圖表縮放、手勢移動、動畫顯示效果、高密度柱形顯示、圖表分界定制線、多圖表的混合顯示及同數(shù)據(jù)源不同類型圖表切換等。EazeGraphAndroid圖表庫,支持柱狀圖、分層柱狀圖、餅狀圖、線性圖WilliamChart繪制圖表的庫,支持LineChartView、BarChartView和StackBarChartView三中圖表類型,并且支持Android2.2及以上的系統(tǒng)。HelloChartsforAndroid支持折線圖、柱狀圖、餅圖、氣泡圖、組合圖;支持預(yù)覽、放大縮小,滾動,部分圖表支持動畫;支持Android2.2以上這些項目都可以在GitHub搜索到。
文章題目:android圖表,android圖庫
轉(zhuǎn)載來于:http://jinyejixie.com/article38/dsedesp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、標(biāo)簽優(yōu)化、品牌網(wǎng)站建設(shè)、、網(wǎng)站設(shè)計公司、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)