Newer
Older
MpAndroidChart / MPChartExample / src / com / xxmassdeveloper / mpchartexample / MyChart3Activity.java
Bello on 2 Mar 2018 11 KB 自定义combined
package com.xxmassdeveloper.mpchartexample;

import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.view.View;

import com.github.mikephil.charting.charts.CombinedChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.CombinedData;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter;
import com.github.mikephil.charting.formatter.MyYAxisValueFormatter;
import com.github.mikephil.charting.interfaces.datasets.IDataSet;
import com.xxmassdeveloper.mpchartexample.custom.MyMarkerView;
import com.xxmassdeveloper.mpchartexample.manage.JsonUtils;
import com.xxmassdeveloper.mpchartexample.manage.P1Data;

import java.util.ArrayList;

/**
 * @Info
 * @Auth Bello
 * @Time 18-2-5 下午4:42
 * @Ver
 */

public class MyChart3Activity extends FragmentActivity {

    String v = "{\"msg\":\"操作成功\",\"data\":[{\"b\":30,\"t\":15,\"plasmaName\":\"保亭\",\"tb\":\"100.00\"},{\"b\":142,\"t\":124," +
            "\"plasmaName\":\"巴马\",\"tb\":\"14.52\"},{\"b\":184,\"t\":91,\"plasmaName\":\"全州\",\"tb\":\"102.20\"},{\"b\":54,\"t\":56," +
            "\"plasmaName\":\"大新\",\"tb\":\"-3.57\"},{\"b\":86,\"t\":84,\"plasmaName\":\"武鸣\",\"tb\":\"2.38\"},{\"b\":105,\"t\":92," +
            "\"plasmaName\":\"马山\",\"tb\":\"14.13\"},{\"b\":47,\"t\":36,\"plasmaName\":\"琼中\",\"tb\":\"30.56\"},{\"b\":40,\"t\":20," +
            "\"plasmaName\":\"白沙\",\"tb\":\"100.00\"},{\"b\":91,\"t\":121,\"plasmaName\":\"大化\",\"tb\":\"-24.79\"},{\"b\":77,\"t\":117," +
            "\"plasmaName\":\"保康\",\"tb\":\"-34.19\"},{\"b\":91,\"t\":122,\"plasmaName\":\"石门\",\"tb\":\"-25.41\"},{\"b\":135,\"t\":78," +
            "\"plasmaName\":\"武宁\",\"tb\":\"73.08\"},{\"b\":53,\"t\":0,\"plasmaName\":\"青田\",\"tb\":\"0.00\"},{\"b\":41,\"t\":23," +
            "\"plasmaName\":\"醴陵\",\"tb\":\"78.26\"},{\"b\":163,\"t\":103,\"plasmaName\":\"上林\",\"tb\":\"58.25\"}],\"error\":\"-1\"}";

    private String[] quarters ;
    private ArrayList<Entry> entries = new ArrayList<>();
    private ArrayList<BarEntry> entries1 = new ArrayList<>();


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_chart);

        final CombinedChart mChart = (CombinedChart) findViewById(R.id.my_chart);

        findViewById(R.id.show_text).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                for (IDataSet set : mChart.getData().getDataSets()) {
                    if (set instanceof LineDataSet)
                        set.setDrawValues(!set.isDrawValuesEnabled());

                    if (set instanceof BarDataSet)
                        set.setDrawValues(!set.isDrawValuesEnabled());
                }
                mChart.invalidate();
            }
        });

        P1Data p1Data = (P1Data) JsonUtils.JsonStrToClass(v, P1Data.class);
        quarters = new String[p1Data.getData().size()];
        for (int i=0; i<p1Data.getData().size();i++){
            quarters[i] = p1Data.getData().get(i).getPlasmaName();
            entries.add(new Entry(i, Float.parseFloat(p1Data.getData().get(i).getTb())));
            entries1.add(new BarEntry(i, p1Data.getData().get(i).getT()));
        }


        //图表描述
        mChart.getDescription().setEnabled(false);
        //图表背景
        mChart.setBackgroundColor(Color.WHITE);
        //是否启用网格背景
        mChart.setDrawGridBackground(false);
        //在各条 bar 后面绘制 “灰色全值 bar”
        mChart.setDrawBarShadow(false);
        //Y轴方向上不允许拉伸
        mChart.setScaleYEnabled(false);
        mChart.setHighlightFullBarEnabled(false);
        //true,没缩放功能。false,x轴和y轴可分别放大
        mChart.setPinchZoom(true);

        //要绘制的组件
        mChart.setDrawOrder(new CombinedChart.DrawOrder[]{CombinedChart.DrawOrder.LINE, CombinedChart.DrawOrder.BAR});

        //点击是显示的marker值
        MyMarkerView mv = new MyMarkerView(this, R.layout.custom_marker_view);
        mv.setChartView(mChart); // For bounds control
        mChart.setMarker(mv); // Set the marker to the chart


        //图例
        Legend l = mChart.getLegend();
        l.setEnabled(true); //是否启用图列(true:下面属性才有意义)
        l.setWordWrapEnabled(true); //设置图列换行(注意使用影响性能,仅适用legend位于图表下面)
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
//        l.setForm(Legend.LegendForm.DEFAULT); //设置图例的形状
        l.setFormSize(10);                    //设置图例的大小
        l.setFormToTextSpace(2f);            //设置每个图例实体中标签和形状之间的间距
        l.setDrawInside(false);
        l.setXEntrySpace(10f);                //设置图例实体之间延X轴的间距(setOrientation = HORIZONTAL有效)
        l.setYEntrySpace(8f);                 //设置图例实体之间延Y轴的间距(setOrientation = VERTICAL 有效)
        l.setYOffset(0f);                     //设置比例块Y轴偏移量
        l.setTextSize(10f);                   //设置图例标签文本的大小
        l.setTextColor(Color.parseColor("#888888"));//设置图例标签文本的颜色


        //左边的Y轴
        YAxis leftAxis = mChart.getAxisLeft();
        leftAxis.setDrawGridLines(false);   //是否显示Y轴网格线
        leftAxis.setAxisMinimum(0f);        //Y轴的最小值
        leftAxis.setTextColor(Color.parseColor("#888888"));   //Y轴文字颜色
//        leftAxis.setLabelCount(10);        //Y轴显示的值个数
        leftAxis.setAxisLineColor(Color.TRANSPARENT);  //Y轴线颜色
        leftAxis.setValueFormatter(new MyYAxisValueFormatter("千人"));


        //右边的Y轴
        YAxis rightAxis = mChart.getAxisRight();
        rightAxis.setDrawGridLines(false);   //是否显示Y轴网格线
        rightAxis.setTextColor(Color.parseColor("#888888"));   //Y轴文字颜色
//        rightAxis.setAxisMinimum(0f);        //Y轴的最小值
//        rightAxis.setAxisMaximum(100);     //设置Y轴最大值
//        rightAxis.setLabelCount(10);        //Y轴显示的值个数
        rightAxis.setAxisLineColor(Color.TRANSPARENT);  //Y轴线颜色
        rightAxis.setDrawZeroLine(false);    //是否显示0值的轴线
        rightAxis.setGranularityEnabled(false);
        rightAxis.setValueFormatter(new MyYAxisValueFormatter("%"));


        //底部X轴
        XAxis xAxis = mChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setDrawGridLines(false);
        xAxis.setAxisMinimum(-0.5f);           //设置轴的最小值。这样设置将不会根据提供的数据自动计算。
        xAxis.setGranularity(1f);           //缩放的时候有用,比如放大的时候,我不想把横轴的月份再细分
        xAxis.setGranularityEnabled(true);
        xAxis.setCenterAxisLabels(false);   //字体下面的标签 显示在每个直方图的中间
        xAxis.setTextColor(Color.parseColor("#cccccc"));
        xAxis.setValueFormatter(new IndexAxisValueFormatter(quarters));//X轴文字
//        xAxis.setAxisMaximum((float) (12 - 0.5)); //以下是为了解决 柱状图 左右两边只显示了一半的问题 根据实际情况 而定
        xAxis.setDrawLabels(true);          //绘制标签  指x轴上的对应数值
        xAxis.setAvoidFirstLastClipping(false);//图表将避免第一个和最后一个标签条目被减掉在图表或屏幕的边缘

        CombinedData data = new CombinedData();
        //添加线图
        data.setData(generateLineData());
        //添加柱图
        data.setData(generateBarData());

        xAxis.setLabelCount((int)data.getXMax(), false);             //一个界面显示几个Lable
        xAxis.setAxisMaximum(data.getXMax() + 0.5f);

        //动画
        mChart.animateXY(3000, 3000);
        mChart.setData(data);
        mChart.invalidate();

    }

    /**
     * 加载线条的数据
     *
     * @return
     */
    private LineData generateLineData() {
        LineData d = new LineData();
        /*ArrayList<Entry> entries = new ArrayList<>();

        for (int index = 0; index < 12; index++)
            entries.add(new Entry(index, (float) (Math.random() * 15) + 25));
*/
        LineDataSet set = new LineDataSet(entries, "同比增长率"); //新建线条数据,并设置示例文字
        set.setColor(Color.parseColor("#CCCCCC"));                 //线条颜色
        set.setLineWidth(0.5f);                     //线条宽度
        set.setDrawCircles(false);                  //是否显示圆点
        set.setCircleColor(Color.GRAY);             //圆点颜色
        set.setCircleRadius(0.8f);                  //圆点半径
        set.setDrawFilled(true);                    //是否颜色填充
        set.setFillColor(Color.parseColor("#CCCCCC"));             //填充颜色
        set.setMode(LineDataSet.Mode.CUBIC_BEZIER); //转折点为曲线
        set.setDrawValues(false);                    //显示数值
        set.setValueTextSize(8f);                  //数值字体大小
        set.setValueTextColor(Color.parseColor("#AAAAAA")); //数值的颜色
        set.setAxisDependency(YAxis.AxisDependency.RIGHT); //以右边Y轴的标签绘制
        d.addDataSet(set);

        return d;
    }

    /**
     * 加载矩形的数据
     *
     * @return
     */
    private BarData generateBarData() {
       /* ArrayList<BarEntry> entries1 = new ArrayList<>();

        for (int index = 0; index < 12; index++) {
            entries1.add(new BarEntry(index, (float) (Math.random() * 15) + 20));
        }*/

//        BarDataSet set1 = new BarDataSet(entries1, "Bar 1");
//        set1.setColor(Color.rgb(113, 180, 230));
//        set1.setValueTextColor(Color.rgb(60, 220, 78));
//        set1.setValueTextSize(10f);
//        set1.setAxisDependency(YAxis.AxisDependency.LEFT);

//        BarData d = new BarData(set1);
//        d.setBarWidth(0.40f);
//        d.groupBars(0, 0.15f, 0.02f);

        BarDataSet barDataSet = new BarDataSet(entries1, "新浆员数");  //新建数据,并设置示例文字
        barDataSet.setColor(Color.parseColor("#FF6633"));       //柱状颜色
        barDataSet.setBarBorderRadius(10f);                               //设置圆角矩形
        barDataSet.setDrawValues(false);
        barDataSet.setValueTextSize(8f);                  //数值字体大小
        barDataSet.setValueTextColor(Color.parseColor("#AAAAAA")); //数值的颜色//是否显示数值
        barDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);          //以左边Y轴的标签绘制

        BarData barData = new BarData();
        barData.addDataSet(barDataSet);

        return barData;
    }



}