Android实现Chart.js

来源:互联网 发布:java 计算两个时间戳 编辑:程序博客网 时间:2024/06/11 01:30

转载地址:http://blog.csdn.net/zengfan1190/article/details/30227029

需要用Android做报表,懒习惯了,从网上下个现成Web控件(无穷尽量,选中了Chart.js,又小又漂亮)的直接结合到android里,方便。

1. 下载Chart.js

        Chart.js 下载地址

2. 新建Android项目

将下载的Chart.js-master解压后放到assets/web里。


3. 代码结构

3.1 入口Activity MainActivity

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.zf.chartjs;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.Fragment;  
  5. import android.support.v4.app.FragmentActivity;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.webkit.WebView;  
  10.   
  11. import com.zf.util.chart.ChartAction;  
  12. import com.zf.util.chart.ChartEntity;  
  13. import com.zf.util.web.WebViewUtil;  
  14.   
  15. public class MainActivity extends FragmentActivity {  
  16.     private static final String MAIN_BAR_ADDR = "file:///android_asset/web/Chart.js-master/samples/bar.html";  
  17.     private static final String MAIN_DOUGHNUT_ADDR = "file:///android_asset/web/Chart.js-master/samples/doughnut.html";  
  18.     private static final String MAIN_LINE_ADDR = "file:///android_asset/web/Chart.js-master/samples/line.html";  
  19.     private static final String MAIN_PIE_ADDR = "file:///android_asset/web/Chart.js-master/samples/pie.html";  
  20.     private static final String MAIN_POLAR_AREA_ADDR = "file:///android_asset/web/Chart.js-master/samples/polarArea.html";  
  21.     private static final String MAIN_RADAR_ADDR = "file:///android_asset/web/Chart.js-master/samples/radar.html";  
  22.     private static final String MAIN_SIXUP_ADDR = "file:///android_asset/web/Chart.js-master/samples/sixup.html";  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.activity_main);  
  28.   
  29.         if (savedInstanceState == null) {  
  30.             getSupportFragmentManager()  
  31.                     .beginTransaction()  
  32.                     .add(R.id.container,  
  33.                             new PlaceholderFragment()).commit();  
  34.         }  
  35.     }  
  36.   
  37.     /** 
  38.      * A placeholder fragment containing a simple view. 
  39.      */  
  40.     public static class PlaceholderFragment extends Fragment {  
  41.   
  42.         public PlaceholderFragment() {  
  43.         }  
  44.   
  45.         @Override  
  46.         public View onCreateView(LayoutInflater inflater,  
  47.                 ViewGroup container, Bundle savedInstanceState) {  
  48.             View rootView = inflater.inflate(  
  49.                     R.layout.fragment_main, container, false);  
  50.             WebView bar = (WebView) rootView  
  51.                     .findViewById(R.id.bar);  
  52.             /* FIXME 如果信息是从网上或者数据库获得的,记得要用异步方法去调用 */  
  53.             initDatas(bar);  
  54.             new WebViewUtil().initWebview(bar, MAIN_BAR_ADDR);  
  55.   
  56.             WebView doughnut = (WebView) rootView  
  57.                     .findViewById(R.id.bar);  
  58.             /* FIXME 如果信息是从网上或者数据库获得的,记得要用异步方法去调用 */  
  59.             initDatas(doughnut);  
  60.             new WebViewUtil().initWebview(doughnut,  
  61.                     MAIN_DOUGHNUT_ADDR);  
  62.   
  63.             WebView line = (WebView) rootView  
  64.                     .findViewById(R.id.line);  
  65.             /* FIXME 如果信息是从网上或者数据库获得的,记得要用异步方法去调用 */  
  66.             initDatas(line);  
  67.             new WebViewUtil().initWebview(line, MAIN_LINE_ADDR);  
  68.   
  69.             WebView pie = (WebView) rootView  
  70.                     .findViewById(R.id.pie);  
  71.             /* FIXME 如果信息是从网上或者数据库获得的,记得要用异步方法去调用 */  
  72.             initDatas(pie);  
  73.             new WebViewUtil().initWebview(pie, MAIN_PIE_ADDR);  
  74.   
  75.             WebView polarArea = (WebView) rootView  
  76.                     .findViewById(R.id.polarArea);  
  77.             /* FIXME 如果信息是从网上或者数据库获得的,记得要用异步方法去调用 */  
  78.             initDatas(polarArea);  
  79.             new WebViewUtil().initWebview(polarArea,  
  80.                     MAIN_POLAR_AREA_ADDR);  
  81.   
  82.             WebView radar = (WebView) rootView  
  83.                     .findViewById(R.id.radar);  
  84.             /* FIXME 如果信息是从网上或者数据库获得的,记得要用异步方法去调用 */  
  85.             initDatas(radar);  
  86.             new WebViewUtil().initWebview(radar, MAIN_RADAR_ADDR);  
  87.   
  88.             WebView sixup = (WebView) rootView  
  89.                     .findViewById(R.id.sixup);  
  90.             /* FIXME 如果信息是从网上或者数据库获得的,记得要用异步方法去调用 */  
  91.             initDatas(sixup);  
  92.             new WebViewUtil().initWebview(sixup, MAIN_SIXUP_ADDR);  
  93.             return rootView;  
  94.         }  
  95.   
  96.         /** 
  97.          * 初始化并为页面加载数据 
  98.          *  
  99.          * @author 曾凡 
  100.          * @param webView 
  101.          * @time 2014年5月16日 下午2:18:15 
  102.          */  
  103.         private void initDatas(WebView webView) {  
  104.             /* FIXME 以下为测试数据 */  
  105.             ChartEntity progress = new ChartEntity();  
  106.             ChartAction action = new ChartAction(getActivity(),  
  107.                     progress);  
  108.             /* 向js发送配置信息 */  
  109.             action.initDatas();  
  110.             /* 返回值 */  
  111.             webView.addJavascriptInterface(action, "action");  
  112.   
  113.         }  
  114.     }  
  115.   
  116. }  
3.2 WebView工具类 WebViewUtil

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.zf.util.web;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.view.KeyEvent;  
  5. import android.view.View;  
  6. import android.view.View.OnKeyListener;  
  7. import android.webkit.ConsoleMessage;  
  8. import android.webkit.JsResult;  
  9. import android.webkit.WebChromeClient;  
  10. import android.webkit.WebSettings;  
  11. import android.webkit.WebView;  
  12. import android.webkit.WebViewClient;  
  13.   
  14. import com.zf.util.Ln;  
  15.   
  16. /** 
  17.  * WebView的工具类 
  18.  *  
  19.  * @author 曾凡 
  20.  * @time 2014年5月16日 上午10:48:32 
  21.  */  
  22. public class WebViewUtil {  
  23.     private WebView mWebView = null;  
  24.     /** 
  25.      * 是否在web链接中启动新的Activity 
  26.      */  
  27.     private boolean startNewActivity = false;  
  28.     /** 
  29.      * 是否启动内部监听back按钮 
  30.      */  
  31.     private boolean enableBack = false;  
  32.   
  33.     /** 
  34.      * 用户必须初始化类时必须调用,可以放到onCreate方法里去执行 
  35.      *  
  36.      * @author 曾凡 
  37.      * @param contentViewId 
  38.      *            layout 
  39.      * @param webViewId 
  40.      *            WebView的ID 
  41.      * @param loadUrl 
  42.      *            网页的地址(网络/本地) 
  43.      * @time 2014年5月16日 上午11:03:03 
  44.      */  
  45.     public void initWebview(WebView webView, String loadUrl) {  
  46.         this.mWebView = webView;  
  47.         WebSettings set = mWebView.getSettings();  
  48.         /* 启动js */  
  49.         set.setJavaScriptEnabled(true);  
  50.         /* 支持缩放 */  
  51.         set.setSupportZoom(true);  
  52.         set.supportMultipleWindows();  
  53.         if (!isEnableBack()) {  
  54.             mWebView.setOnKeyListener(new MainWebViewOnKeyListener());  
  55.         }  
  56.         if (!isStartNewActivity()) {  
  57.             mWebView.setWebViewClient(new MainWebViewClient());  
  58.         }  
  59.         mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);  
  60.         mWebView.setWebChromeClient(new MainWebChromeClient());  
  61.           
  62.         mWebView.loadUrl(loadUrl);  
  63.   
  64.     }  
  65.   
  66.     private class MainWebChromeClient extends WebChromeClient {  
  67.   
  68.         @Override  
  69.         public boolean onJsAlert(WebView view, String url,  
  70.                 String message, JsResult result) {  
  71.             Ln.i("message");  
  72.             result.confirm();  
  73.             return true;  
  74.         }  
  75.   
  76.         /* 
  77.          * Since API Level 8 
  78.          */  
  79.         @Override  
  80.         public boolean onConsoleMessage(  
  81.                 ConsoleMessage consoleMessage) {  
  82.             return super.onConsoleMessage(consoleMessage);  
  83.         }  
  84.   
  85.         @Override  
  86.         public void onProgressChanged(WebView view,  
  87.                 int newProgress) {  
  88.   
  89.         }  
  90.     }  
  91.   
  92.     private class MainWebViewOnKeyListener implements  
  93.             OnKeyListener {  
  94.   
  95.         @Override  
  96.         public boolean onKey(View v, int keyCode, KeyEvent event) {  
  97.             if (event.getAction() == KeyEvent.ACTION_DOWN) {  
  98.   
  99.                 if (keyCode == KeyEvent.KEYCODE_BACK  
  100.                         && mWebView.canGoBack()) { // 表示按返回键时的操作  
  101.                     mWebView.goBack(); // 后退  
  102.                     // mWebView.goForward();//前进  
  103.                     return true;  
  104.                 }  
  105.             }  
  106.             return false;  
  107.         }  
  108.     }  
  109.   
  110.     /** 
  111.      * 如果页面中链接,如果希望点击链接继续在当前browser中响应, 而不是新开Android的系统browser中响应该链接,必须覆盖 
  112.      * webview的WebViewClient对象。 
  113.      */  
  114.     public class MainWebViewClient extends WebViewClient {  
  115.   
  116.         public boolean shouldOverviewUrlLoading(WebView view,  
  117.                 String url) {  
  118.             view.loadUrl(url);  
  119.             return true;  
  120.         }  
  121.   
  122.         public void onPageStarted(WebView view, String url,  
  123.                 Bitmap favicon) {  
  124.         }  
  125.   
  126.         public void onPageFinished(WebView view, String url) {  
  127.   
  128.         }  
  129.   
  130.         public void onReceivedError(WebView view, int errorCode,  
  131.                 String description, String failingUrl) {  
  132.         }  
  133.     }  
  134.   
  135.     public boolean isStartNewActivity() {  
  136.         return startNewActivity;  
  137.     }  
  138.   
  139.     public void setStartNewActivity(boolean startNewActivity) {  
  140.         this.startNewActivity = startNewActivity;  
  141.     }  
  142.   
  143.     public boolean isEnableBack() {  
  144.         return enableBack;  
  145.     }  
  146.   
  147.     public void setEnableBack(boolean enableBack) {  
  148.         this.enableBack = enableBack;  
  149.     }  
  150. }  
3.3 向报表中传值并提供后台Java调用的action:ChartAction

但是本次在页面中没有体现相对应的接受参数代码。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.zf.util.chart;  
  2.   
  3. import android.app.Activity;  
  4. import android.webkit.JavascriptInterface;  
  5. import android.widget.Toast;  
  6.   
  7. import com.google.gson.Gson;  
  8. import com.zf.util.Strings;  
  9.   
  10. /** 
  11.  * js方法一定要加@JavascriptInterface 否则 does not work on API 17 
  12.  *  
  13.  * @author 曾凡 
  14.  * @time 2014年5月16日 下午1:27:49 
  15.  */  
  16.   
  17. public class ChartAction {  
  18.   
  19.     private Activity mActivity;  
  20.     private ChartEntity entity;  
  21.   
  22.     public ChartAction(Activity activity,  
  23.             ChartEntity entity) {  
  24.         this.mActivity = activity;  
  25.         this.entity = entity;  
  26.     }  
  27.   
  28.     /** 
  29.      * java 将数据传给js 通过loadUrl()调用 js方法 
  30.      */  
  31.     @JavascriptInterface  
  32.     public String initDatas() {  
  33.         String jsonStr = new Gson().toJson(entity);  
  34.         return jsonStr;  
  35.     }  
  36.   
  37.     /** 
  38.      * js 将数据传给 java 通过WebView 的addJavascriptInterface()方法 映射一个对象 
  39.      * 然后再js中通过javascript:对象.方法(参数)的方式调用 
  40.      *  
  41.      * @param s 
  42.      */  
  43.     @JavascriptInterface  
  44.     public void updateDatas(String jsMsg) {  
  45.         ChartEntity entity = new Gson().fromJson(  
  46.                 Strings.toString(jsMsg), ChartEntity.class);  
  47.         Toast.makeText(mActivity,  
  48.                 "我是从Js星来的JSON,我现在是JAVA类:" + entity.toString(),  
  49.                 Toast.LENGTH_SHORT).show();  
  50.     }  
  51.   
  52. }  
3.3 编写要向前台发送的POJO实体类,可以用Gson直接转

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.zf.util.chart;  
  2. /** 
  3.  * @author 曾凡 
  4.  * @time 2014年6月10日 上午10:09:10 
  5.  */  
  6. public class ChartEntity {  
  7.   
  8. }  
3.4 layout文件 fragment_main.xml

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:scrollbars="vertical" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         android:orientation="vertical">  
  11.   
  12.         <WebView  
  13.             android:id="@+id/bar"  
  14.             android:layout_width="wrap_content"  
  15.             android:layout_height="wrap_content"  
  16.             android:layout_gravity="center_horizontal" />  
  17.   
  18.         <WebView  
  19.             android:id="@+id/doughnut"  
  20.             android:layout_width="wrap_content"  
  21.             android:layout_height="wrap_content"  
  22.             android:layout_gravity="center_horizontal" />  
  23.   
  24.         <WebView  
  25.             android:id="@+id/line"  
  26.             android:layout_width="wrap_content"  
  27.             android:layout_height="wrap_content"  
  28.             android:layout_gravity="center_horizontal" />  
  29.   
  30.         <WebView  
  31.             android:id="@+id/pie"  
  32.             android:layout_width="wrap_content"  
  33.             android:layout_height="wrap_content"  
  34.             android:layout_gravity="center_horizontal" />  
  35.   
  36.         <WebView  
  37.             android:id="@+id/polarArea"  
  38.             android:layout_width="wrap_content"  
  39.             android:layout_height="wrap_content"  
  40.             android:layout_gravity="center_horizontal" />  
  41.   
  42.         <WebView  
  43.             android:id="@+id/radar"  
  44.             android:layout_width="wrap_content"  
  45.             android:layout_height="wrap_content"  
  46.             android:layout_gravity="center_horizontal" />  
  47.   
  48.         <WebView  
  49.             android:id="@+id/sixup"  
  50.             android:layout_width="wrap_content"  
  51.             android:layout_height="wrap_content"  
  52.             android:layout_gravity="center_horizontal" />  
  53.     </LinearLayout>  
  54.   
  55. </ScrollView>  
4. 运行结果


5.源代码

下载地址



0 0