LWUIT + ChartComponent 之一实现饼图(PieChart)

本文来自http://blog.csdn.net/hellogv/


    本文源代码下载地址:http://download.csdn.net/source/872671
    本文所用的Chart组件为J2me ChartComponent - ver 1.5.2,该组件的下载页面为http://www.beanizer.org/site/index.php/en/Software/J2me-ChartComponent-ver-1.5.html。按照官网所说,
ChartComponent的二进制开发包可以用于个人开发以及商业项目,而源代码则需要购买,为了支持作者开发,最好是购买一份啦
ChartComponent,基于J2ME的LCDUI,而本文要演示的是,如何把ChartComponent运用到LWUIT之上,其他LCDUI的控件也可以参照这个方法,从而运作在LWUIT上
    在LWUIT上实现Chart功能,可以利用LWUIT固有的组件,混合使用,效果挺好的,例如加入chart的每个图块说明(说明与图块颜色对应)时,可以用FlowLayout排列方式+Label控件,能够自适应,比用UI直接画省好多功夫。
  • 首先,先在主文件UIDemoMIDlet加入以下代码:
  1.     /**
  2.      * lcdui的图像转换为lwuit的图像
  3.      */
  4.     static Image lcdui2lwuit(javax.microedition.lcdui.Image lcdui_img)
  5.     {
  6.         //新建RGB数组
  7.         int[] bufferArray = new int[lcdui_img.getWidth() * lcdui_img.getHeight()];
  8.         //把lcdui的Image保存为RGB数组
  9.         lcdui_img.getRGB(bufferArray, 0, lcdui_img.getWidth(), 00, lcdui_img.getWidth(), lcdui_img.getHeight());
  10.         //********透明背景,可以省略*******************************************//
  11.         for(int i=0;i<bufferArray.length;i++){
  12.             if((bufferArray[i] & 0x00FFFFFF) == 0x00FFFFFF)//如果是背景
  13.                 bufferArray[i]=bufferArray[i]&0x00FFFFFF;
  14.         }
  15.         //********透明背景,可以省略*******************************************//
  16.         //新建lwuit的Image,并读取RGB数组
  17.         Image result = Image.createImage(bufferArray, lcdui_img.getWidth(), lcdui_img.getHeight());
  18.         return result;
  19.     }
  20.     /**
  21.      * RGB颜色转换为int
  22.     */
  23.     static int RGBtoInt(int r,int g,int b)
  24.     {
  25.         String result=Integer.toHexString(r)+Integer.toHexString(g)+Integer.toHexString(b);
  26.         return Integer.parseInt(result,16);
  27.     }
  • 其次,编写PieChartDemo的代码,代码有详细的注释,非常好理解:
  1. /*
  2.  * LWUIT + ChartComponent,实现多种图表
  3.  * 作者:张国威(咪当俺系噜噜)
  4.  * 本例实现的是“饼图”
  5.  */
  6. package com.sun.lwuit.uidemo;
  7. import com.sun.lwuit.Button;
  8. import com.sun.lwuit.Command;
  9. import com.sun.lwuit.Font;
  10. import com.sun.lwuit.Form;
  11. import com.sun.lwuit.Image;
  12. import com.sun.lwuit.Label;
  13. import com.sun.lwuit.events.ActionEvent;
  14. import com.sun.lwuit.events.ActionListener;
  15. import com.sun.lwuit.layouts.FlowLayout;
  16. import org.beanizer.j2me.charts.ChartItem;
  17. import org.beanizer.j2me.charts.PieChart;
  18. public class PieChartDemo implements ActionListener {
  19.     public Form form = new Form("VBarChartDemo");
  20.     private  Command backCommand = new Command("Back"1);
  21.     final PieChart pieChart= new PieChart("");
  22.     PieChartDemo()
  23.     {
  24.         //饼图说明
  25.         String chart_str[]={"█ A:你好吗","█ B:早上好","█ C:中午好","█ D:晚上好","█ E:吃宵夜","█ F:睡懒觉"};
  26.         //饼图颜色
  27.         int [][]color={{0,0,200},{0,200,0},{50,15,30},{100,0,200},{0,200,100},{200,100,200}};
  28.         //饼图范围
  29.         int []percent={15,10,5,20,34,16};
  30.         //绘制柱体的说明
  31.         initChartInfo(chart_str,color);
  32.         int width=form.getWidth();
  33.         int height=form.getHeight()-60;
  34.         Image img_hbarChart=drawPieChart(pieChart,width,height,"",color,percent);//绘制柱体图
  35.         Button button = new Button(img_hbarChart);
  36.         button.getStyle().setBgTransparency(1);//透明背景,会非常消耗资源,速度减慢,注意使用
  37.         button.setBorderPainted(false);
  38.         form.addComponent(button);
  39.         form.addCommand(backCommand);
  40.         form.setCommandListener(this);
  41.         form.setLayout(new FlowLayout());//必须使用这种排列,FlowLayout最适合
  42.     }
  43.     private void initChartInfo(String []chart_str,int [][]color)
  44.     {
  45.         for(int i=0;i<chart_str.length;i++)//循环
  46.         {
  47.             Label chart_info = new Label(chart_str[i]);
  48.             chart_info.getStyle().setFgColor(UIDemoMIDlet.RGBtoInt(color[i][0],color[i][1],color[i][2]));
  49.             form.addComponent(chart_info);
  50.         }
  51.     }
  52.     private Image drawPieChart(ChartItem item,
  53.             int width,
  54.             int height,
  55.             String imagefile,
  56.             int [][]color,//柱体颜色
  57.             int []percent)//柱体长度(百分比)
  58.     {
  59.         item.setFont(Font.FACE_PROPORTIONAL,Font.STYLE_PLAIN,Font.SIZE_SMALL);
  60.         item.setDrawAxis(true);
  61.         item.setPreferredSize(width-80,width-80);//设置chart控件的大小,饼图必须width=height
  62.        
  63.         if(imagefile.length()>0)//需要使用背景时
  64.         {
  65.             try{
  66.                 javax.microedition.lcdui.Image img=javax.microedition.lcdui.Image.createImage(imagefile);//读取背景图
  67.                 item.setBackgroundImage(img);//设置背景图
  68.             } catch(Exception ex){ex.printStackTrace();}
  69.         }
  70.         item.showShadow(true);//使用阴影特效
  71.         item.setShadowColor(20,20,20);//设置阴影颜色
  72.         item.setColor(4040200);
  73.         item.resetData();
  74.         for(int i=0;i<color.length;i++)//循环绘画柱体
  75.         {
  76.             item.addElement(String.valueOf((char)('a'+i)),percent[i],color[i][0],color[i][1],color[i][2]);
  77.         }
  78.     
  79.         item.setMaxValue(100);//柱体代表数值的显示范围,100%
  80.         //这个是lcdui的Image
  81.         javax.microedition.lcdui.Image lcdui_img=
  82.                 javax.microedition.lcdui.Image.createImage(width,height);//饼图大小,图像>控件
  83.         //这个是lcdui的Graphics
  84.         javax.microedition.lcdui.Graphics lcdui_g= lcdui_img.getGraphics();
  85.         pieChart.drawPie(lcdui_g,
  86.                 40,//x
  87.                 40,//y
  88.                 width-100,//宽
  89.                 width-100);//长,这里设置的大小必须比width,height小,才能完全显示
  90.         return UIDemoMIDlet.lcdui2lwuit(lcdui_img);
  91.     }
  92.     public void actionPerformed(ActionEvent arg0) {
  93.         if(arg0.getCommand()==backCommand)
  94.         {
  95.             UIDemoMIDlet.backToMainMenu();
  96.         }
  97.     }
  98. }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值