Loading

Android图表开发——AChartEngine

Android图表控件的开发

曾经开发过一个小程序,在Android电视机上面开发一个APP,用于显示一些统计图表的信息。最后找来找去基于Android Native开发有AChartEngine现成的组件可用,于是就直接导入jar包,看api文档进行了开发。当然这只是一个客户端程序,数据的来源需要通过服务端程序获得,项目中通过wcf返回json格式的数据。

代码片段

new Thread(new Runnable() {
    @Override
    public void run() {
        SoapObject soapObject = Util.callWS(nameSpace, methodName2,wsdl, null);
        if (soapObject != null) {
            String result = soapObject.getProperty(0).toString();
            Message msg = new Message();
            msg.what = chart2;
            msg.obj = result;
            handler.sendMessage(msg);
        }
    }
}).start();
/**
     * @param nameSpace
     *            WS的命名空间
     * @param methodName
     *            WS的方法名
     * @param wsdl
     *            WS的wsdl的完整路径名
     * @param params
     *            WS的方法所需要的参数
     * @return SoapObject对象
     */
    public static SoapObject callWS(String nameSpace, String methodName,
            final String wsdl, Map<String, Object> params) {
        final String SOAP_ACTION = nameSpace + "/service/" + methodName;
        SoapObject soapObject = new SoapObject(nameSpace, methodName);
        if ((params != null) && (!params.isEmpty())) {
            Iterator<Entry<String, Object>> it = params.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<String, Object> e = (Map.Entry<String, Object>) it
                        .next();
                soapObject.addProperty(e.getKey(), e.getValue());
            }
        }

        final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.bodyOut = soapObject;
        envelope.dotNet = true;// 兼容.NET开发的Web Service
        envelope.setOutputSoapObject(soapObject);
        try {
            HttpTransportSE ht = new HttpTransportSE(wsdl);
            ht.call(SOAP_ACTION, envelope);
            if (envelope.getResponse() != null) {
                SoapObject result = (SoapObject) envelope.bodyIn;
                ht = null;
                return result;
            } else {
                return null;
            }
        } catch (Exception e) {
            Log.e("error", e.getMessage());
            return null;
        }
    }
String result2 = (String) msg.obj;
int[] colors2 = new int[] { Color.argb(255, 10, 44, 81),Color.argb(255, 182, 34, 49) };
DefaultRenderer renderer2 = SexChart.buildCategoryRenderer(colors2);

// String result =
// "{\"Result_List\":[ { \"SEX\":\"其它\",\"NUM\":\"1\"}, {\"SEX\":\"男\",\"NUM\":\"37\"}, {\"SEX\":\"女\",\"NUM\":\"2\"}]}";
List<Map<String, Object>> list2 = Util.convertJSON2List(result2, "Result_List", new String[] { "SEX", "NUM" });
CategorySeries categorySeries = new CategorySeries("Vehicles Chart");
for (Map<String, Object> map : list2) {
    categorySeries.add(map.get("SEX").toString(),
    Double.parseDouble(map.get("NUM").toString()));
}
View view2 = ChartFactory.getPieChartView(Main.this,categorySeries, renderer2);
if (view2 != null) {
   layout01.removeAllViews();
   layout01.destroyDrawingCache();
   layout01.addView(view2);
} else {
   Toast.makeText(Main.this, "统计结果获取失败。", Toast.LENGTH_LONG).show();
}
public static List<Map<String, Object>> convertJSON2List(String result,String name, String[] fields) {
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    try {
        JSONArray array = new JSONObject(result).getJSONArray(name);
        for (int i = 0; i < array.length(); i++) {
           JSONObject object = (JSONObject) array.opt(i);
           Map<String, Object> map = new HashMap<String, Object>();
               for (String str : fields) {
                   map.put(str, object.get(str));
               }
               list.add(map);
           }
        } catch (JSONException e) {
            Log.e("error", e.getMessage());
        }
    return list;
}

 

效果图

参考资料:

http://www.achartengine.org/content/demo.html

posted @ 2016-06-14 11:10  guwei4037  阅读(708)  评论(0编辑  收藏  举报