Android 柱状图

依赖

compile 'org.xclcharts:lib:2.4'

自定义view1

/**
 * @ClassName DemoView
 * @Description  各个例子view的view基类
 */
public class DemoView extends ChartView{


    public DemoView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public DemoView(Context context, AttributeSet attrs){
        super(context, attrs);

    }

    public DemoView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    //Demo中bar chart所使用的默认偏移值。
    //偏移出来的空间用于显示tick,axistitle....
    protected int[] getBarLnDefaultSpadding()
    {
        int [] ltrb = new int[4];
        ltrb[0] = DensityUtil.dip2px(getContext(), 40); //left
        ltrb[1] = DensityUtil.dip2px(getContext(), 60); //top
        ltrb[2] = DensityUtil.dip2px(getContext(), 20); //right
        ltrb[3] = DensityUtil.dip2px(getContext(), 40); //bottom
        return ltrb;
    }

    protected int[] getPieDefaultSpadding()
    {
        int [] ltrb = new int[4];
        ltrb[0] = DensityUtil.dip2px(getContext(), 20); //left
        ltrb[1] = DensityUtil.dip2px(getContext(), 65); //top
        ltrb[2] = DensityUtil.dip2px(getContext(), 20); //right
        ltrb[3] = DensityUtil.dip2px(getContext(), 20); //bottom
        return ltrb;
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

    }

}

自定义view2

/**
 * @ClassName SpinnerBarChart01View
 * @Description  柱形图同数据源不同柱形图切换的例子
 */
public class SpinnerBarChart01View extends DemoView {

    private String TAG = "SpinnerBarChart01View";

    private int mChartStyle = 0;
    private int mOffsetHeight = 0;
    private BarChart mChart = null;
    //标签轴
    private List<String> chartLabels = new LinkedList<String>();
    private List<BarData> chartData = new LinkedList<BarData>();

    public SpinnerBarChart01View(Context context, int chartStyle, int offsetHeight) {//主要构造方法
        super(context);
        // TODO Auto-generated constructor stub

        mChartStyle = chartStyle;
        mOffsetHeight = offsetHeight;
        chartLabels();
        chartDataSet();
        chartRender();
    }

    private void initChart(int chartStyle)
    {
        switch(chartStyle)
        {
            case 0: //竖向柱形图
                mChart = new BarChart();
                //图例
                mChart.getAxisTitle().setLeftTitle("百分比");
                break;
            case 1:    //横向柱形图
                mChart = new BarChart();
                mChart.setChartDirection(XEnum.Direction.HORIZONTAL);
                break;
            case 2:    //竖向3D柱形图
                mChart = new BarChart3D();
                break;
            case 3:    //横向3D柱形图
                mChart = new BarChart3D();
                mChart.setChartDirection(XEnum.Direction.HORIZONTAL);
                break;
            case 4:    //竖向堆叠柱形图
                mChart = new StackBarChart();
                ((StackBarChart) mChart).setTotalLabelVisible(false);
                break;
            case 5:    //横向堆叠柱形图
                mChart = new StackBarChart();
                mChart.setChartDirection(XEnum.Direction.HORIZONTAL);
                ((StackBarChart) mChart).setTotalLabelVisible(false);
                break;
        }


    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //图所占范围大小
        //mChart.setChartRange(w,h);
    }

    public void chartRender()
    {
        try {

            initChart(mChartStyle);

            //设置绘图区默认缩进px值,留置空间显示Axis,Axistitle....
            int [] ltrb = getBarLnDefaultSpadding();
            mChart.setPadding(DensityUtil.dip2px(getContext(), 50),ltrb[1], ltrb[2], ltrb[3]);
            //主图缩进left, float top, float right,float bottom


            //数据源
            mChart.setDataSource(chartData);//图形数据
            mChart.setCategories(chartLabels);//底部标签

            //数据轴
            mChart.getDataAxis().setAxisMax(100);
            mChart.getDataAxis().setAxisMin(0);
            mChart.getDataAxis().setAxisSteps(20);

            //定义数据轴标签显示格式
            mChart.getDataAxis().setLabelFormatter(new IFormatterTextCallBack(){

                @Override
                public String textFormatter(String value) {
                    // TODO Auto-generated method stub
                    Double tmp = Double.parseDouble(value);
                    DecimalFormat df = new DecimalFormat("#0");
                    String label = df.format(tmp).toString();
                    return label+"%";
                }

            });
            //定义柱形上标签显示格式
            mChart.getBar().setItemLabelVisible(true);
            mChart.getBar().getItemLabelPaint().setColor(Color.rgb(72, 61, 139));
            mChart.getBar().getItemLabelPaint().setFakeBoldText(true);

            mChart.setItemLabelFormatter(new IFormatterDoubleCallBack() {
                @Override
                public String doubleFormatter(Double value) {
                    // TODO Auto-generated method stub
                    DecimalFormat df=new DecimalFormat("#0");
                    String label = df.format(value).toString();
                    return label+"%";
                }});


            mChart.DeactiveListenItemClick();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.e(TAG, e.toString());
        }
    }
    private void chartDataSet()
    {
        //标签对应的柱形数据集
        List<Double> dataSeriesA= new LinkedList<Double>();//一组一类
        dataSeriesA.add(50d);
        dataSeriesA.add(25d);
        dataSeriesA.add(20d);
        BarData BarDataA = new BarData("Google",dataSeriesA,Color.rgb(73, 135, 218));

        List<Double> dataSeriesB= new LinkedList<Double>();
        dataSeriesB.add(35d);
        dataSeriesB.add(65d);
        dataSeriesB.add(75d);
        BarData BarDataB = new BarData("Baidu",dataSeriesB,Color.rgb(224, 4, 0));

        List<Double> dataSeriesC= new LinkedList<Double>();
        dataSeriesC.add(15d);
        dataSeriesC.add(10d);
        dataSeriesC.add(5d);
        BarData BarDataC = new BarData("Bing",dataSeriesC,Color.rgb(255, 185, 0));

        chartData.add(BarDataA);
        chartData.add(BarDataB);
        chartData.add(BarDataC);
    }

    private void chartLabels()
    {
        chartLabels.add("路人甲");
        chartLabels.add("路人乙");
        chartLabels.add("路人丙");
    }

    @Override
    public void render(Canvas canvas) {
        try{

            mChart.setChartRange(0.0f, mOffsetHeight, this.getWidth(),this.getHeight() - mOffsetHeight);


            //mChart.setChartRange(this.getMeasuredWidth(), this.getMeasuredHeight());
            mChart.render(canvas);
        } catch (Exception e){
            Log.e(TAG, e.toString());
        }
    }
}

类型

 
 <string-array name="spinnerbarstyle">
    <item>竖向柱形图</item>   
    <item>横向柱形图</item>        
<item>竖向3D柱形图 </item>
<item>横向3D柱形图</item>
<item>竖向堆积柱形图 </item>
<item>横向堆积柱形图 </item>
</string-array>

layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="@color/white"
    tools:context=".Myzhuxin" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/tv_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="huangyihuang"
                />
            <Spinner
                android:id="@+id/spinner1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>

        <!--    android:layout_width="match_parent"
           android:layout_height="wrap_content"
            -->
        <LinearLayout
            android:id="@+id/lay_chart"
            android:layout_width="500dip"
            android:layout_height="500dip"
            android:orientation="vertical">
        </LinearLayout>

    </LinearLayout>

</RelativeLayout>

java代码

public class Myzhuxin extends Activity {

    private Spinner mSpinner = null;
    private LinearLayout mLaychart = null;
    private int mSelected = 0;
    private int mMoveHeight = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myzhuxingtu);
        mLaychart = (LinearLayout) this.findViewById(R.id.lay_chart);
        mSpinner = (Spinner) findViewById(R.id.spinner1);
        mMoveHeight = mSpinner.getHeight();

        String[] mItems = null;
        // 建立数据源
        mItems = getResources().getStringArray(R.array.spinnerbarstyle);


        ArrayAdapter<String> _Adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, mItems);
        mSpinner.setAdapter(_Adapter);
        mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub
            }

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                // TODO Auto-generated method stub

                renderChart(position);
            }
        });


        renderChart(0);
    }

    private void renderChart(int position) {

        int width = DensityUtil.dip2px(getApplicationContext(), 300);
        int height = DensityUtil.dip2px(getApplicationContext(), 400);
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width, height);
        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);

        mLaychart.removeAllViews();
        SpinnerBarChart01View barChart01 = new SpinnerBarChart01View(this, position, mMoveHeight);
        mLaychart.addView(barChart01, layoutParams);


    }

}

猜你喜欢

转载自blog.csdn.net/meixi_android/article/details/81061401