如何自定义BarChartActivityMultiDataset

时间:2016-11-29 22:31:44

标签: android mpandroidchart

大家好,我正在从MPAndroid库图表中集成BarChartMultiDataset。 我希望在每个2栏的顶部与2009年和2010年处于同一水平 喜欢这个截图

state of my activity 这是我的活动代码:

public class BarChartActivityMultiDataset extends DemoBase implements OnSeekBarChangeListener,
    OnChartValueSelectedListener {
private BarChart mChart;
private SeekBar mSeekBarX, mSeekBarY;
private TextView tvX, tvY;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_barchart);

    tvX = (TextView) findViewById(R.id.tvXMax);
    tvX.setTextSize(10);
    tvY = (TextView) findViewById(R.id.tvYMax);

    mSeekBarX = (SeekBar) findViewById(R.id.seekBar1);
    mSeekBarX.setOnSeekBarChangeListener(this);

    mSeekBarY = (SeekBar) findViewById(R.id.seekBar2);
    mSeekBarY.setOnSeekBarChangeListener(this);

    mChart = (BarChart) findViewById(R.id.chart1);
    mChart.setOnChartValueSelectedListener(this);
    mChart.getDescription().setEnabled(false);


    // scaling can now only be done on x- and y-axis separately
    mChart.setPinchZoom(false);

    mChart.setDrawBarShadow(false);

    mChart.setDrawGridBackground(false);

    // create a custom MarkerView (extend MarkerView) and specify the layout
    // to use for it
    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

    mSeekBarX.setProgress(10);
    mSeekBarY.setProgress(100);

    Legend l = mChart.getLegend();
    l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
    l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
    l.setOrientation(Legend.LegendOrientation.VERTICAL);
    l.setDrawInside(true);
    l.setTypeface(mTfLight);
    l.setYOffset(0f);
    l.setXOffset(10f);
    l.setYEntrySpace(0f);
    l.setTextSize(8f);
    XAxis xAxis = mChart.getXAxis();
    xAxis.setTypeface(mTfLight);
    xAxis.setGranularity(1f);
    xAxis.setCenterAxisLabels(true);
    xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return String.valueOf((int) value);
        }
    });

    YAxis leftAxis = mChart.getAxisLeft();
    leftAxis.setTypeface(mTfLight);
    leftAxis.setValueFormatter(new LargeValueFormatter());
    leftAxis.setDrawGridLines(false);
    leftAxis.setSpaceTop(35f);
    leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)

    mChart.getAxisRight().setEnabled(false);
}



@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

    float groupSpace = 0.08f;
    float barSpace = 0.03f; // x4 DataSet
    float barWidth = 0.2f; // x4 DataSet
    // (0.2 + 0.03) * 4 + 0.08 = 1.00 -> interval per "group"

    int groupCount = 3 + 1;
    int startYear = 2009;
    int endYear = startYear + groupCount;

    tvX.setText(startYear + "-" + endYear);
    tvY.setText("" + (mSeekBarY.getProgress()));

    ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
    ArrayList<BarEntry> yVals2 = new ArrayList<BarEntry>();
  //  ArrayList<BarEntry> yVals3 = new ArrayList<BarEntry>();
   // ArrayList<BarEntry> yVals4 = new ArrayList<BarEntry>();

    float randomMultiplier = mSeekBarY.getProgress() * 100000f;

    for (int i = startYear; i < endYear; i++) {
        yVals1.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
        yVals2.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
   //     yVals3.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
   //   yVals4.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
    }

    BarDataSet set1, set2, set3, set4;

    if (mChart.getData() != null && mChart.getData().getDataSetCount() > 0) {

        set1 = (BarDataSet) mChart.getData().getDataSetByIndex(0);
        set2 = (BarDataSet) mChart.getData().getDataSetByIndex(1);
        set3 = (BarDataSet) mChart.getData().getDataSetByIndex(2);
        set4 = (BarDataSet) mChart.getData().getDataSetByIndex(3);
        set1.setValues(yVals1);
        set2.setValues(yVals2);
        //set3.setValues(yVals3);
        //set4.setValues(yVals4);
        mChart.getData().notifyDataChanged();
        mChart.notifyDataSetChanged();

    } else {
        // create 4 DataSets
        set1 = new BarDataSet(yVals1, "Company A");
        set1.setColor(Color.rgb(104, 241, 175));
        set2 = new BarDataSet(yVals2, "Company B");
        set2.setColor(Color.rgb(164, 228, 251));
       // set3 = new BarDataSet(yVals3, "Company C");
       // set3.setColor(Color.rgb(242, 247, 158));
        //set4 = new BarDataSet(yVals4, "Company D");
       // set4.setColor(Color.rgb(255, 102, 0));

        BarData data = new BarData(set1, set2);
        data.setValueFormatter(new LargeValueFormatter());
        data.setValueTypeface(mTfLight);

        mChart.setData(data);
    }

    // specify the width each bar should have
    mChart.getBarData().setBarWidth(barWidth);

    // restrict the x-axis range
    mChart.getXAxis().setAxisMinimum(startYear);

    // barData.getGroupWith(...) is a helper that calculates the width each group needs based on the provided parameters
    mChart.getXAxis().setAxisMaximum(startYear + mChart.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount);
    mChart.groupBars(startYear, groupSpace, barSpace);
    mChart.invalidate();
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub
}
@Override
public void onValueSelected(Entry e, Highlight h) {
    Log.i("Activity", "Selected: " + e.toString() + ", dataSet: " + h.getDataSetIndex());
}
@Override
public void onNothingSelected() {
    Log.i("Activity", "Nothing selected.");
}}

1 个答案:

答案 0 :(得分:0)

我认为你期望的是这一个班轮:

mChart.getXAxis().setPosition(XAxis.XAxisPosition.TOP);

来自setPosition的文档:

  

设置x标签的位置