HardBirch

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

时间:08-12-15 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:6 点击: 2,882 次


    本文源代码下载地址: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. }



声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: LWUIT + ChartComponent 之一实现饼图(PieChart)

LWUIT + ChartComponent 之一实现饼图(PieChart):目前有6 条留言

  1. 6楼
    maoxuchu:

    您好,RGBtoInt方法好像不对啊:
    static int RGBtoInt(int r,int g,int b)
    {
    return 0xff000000 | ((r &amp; 0xff) &lt;&lt; 16) | ((g &amp; 0xff) &lt;&lt; 8) | (b &amp; 0xff);

    }

    2009-02-12 14:47 [回复]
  2. 5楼
    maoxuchu:

    您好,RGBtoInt方法好像不对啊:
    static int RGBtoInt(int r,int g,int b)
    {
    return 0xff000000 | ((r &amp; 0xff) &lt;&lt; 16) | ((g &amp; 0xff) &lt;&lt; 8) | (b &amp; 0xff);

    }

    2009-02-12 14:47 [回复]
  3. 4楼
    maoxuchu:

    您好,RGBtoInt方法好像不对啊:
    static int RGBtoInt(int r,int g,int b)
    {
    return 0xff000000 | ((r &amp; 0xff) &lt;&lt; 16) | ((g &amp; 0xff) &lt;&lt; 8) | (b &amp; 0xff);

    }

    2009-02-12 14:48 [回复]
  4. 地板
    maoxuchu:

    您好,RGBtoInt方法好像不对啊:
    static int RGBtoInt(int r,int g,int b)
    {
    return 0xff000000 | ((r &amp; 0xff) &lt;&lt; 16) | ((g &amp; 0xff) &lt;&lt; 8) | (b &amp; 0xff);

    }

    2009-02-12 14:48 [回复]
  5. 板凳
    maoxuchu:

    您好,RGBtoInt方法好像不对啊:
    static int RGBtoInt(int r,int g,int b)
    {
    return 0xff000000 | ((r &amp; 0xff) &lt;&lt; 16) | ((g &amp; 0xff) &lt;&lt; 8) | (b &amp; 0xff);

    }

    2009-02-12 14:48 [回复]
  6. 沙发
    maowei0802:

    代码下下来 跑不起来啊
    java.lang.NoClassDefFoundError: com/sun/lwuit/uidemo/UIDemoMIDlet: com/sun/lwuit/events/ActionListener
    at com.sun.midp.midlet.MIDletState.createMIDlet( 29)
    at com.sun.midp.midlet.Scheduler.schedule( 52)
    at com.sun.midp.main.Main.runLocalClass( 28)
    at com.sun.midp.main.Main.main( 80)
    Execution completed.

    2009-10-27 16:33 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐