导入 implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
调用
public class DayReportActivity extends AppCompatActivity { private BarChart chart1 ,chart2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_day_report); initView(); } private void initView() { chart1 = findViewById(R.id.chart1); chart2 = findViewById(R.id.chart2); //x 周默认输值 可用下面的x_value代替 List<Float> x_number = new ArrayList<>(); for (int i = 0; i < 10; i++) { x_number.add((float)i); } //y的值 List<Float> y_value = new ArrayList<>(); y_value.add((float)34); y_value.add((float)74); y_value.add((float)61); y_value.add((float)19); y_value.add((float)73); y_value.add((float)23); y_value.add((float)52); y_value.add((float)83); y_value.add((float)6); y_value.add((float)47); //x的值 String[] x_value = {"A","B","C","D","E","F","G","H","I","J"}; //单行柱状图 BarChartActivityOnlyUtils.init(DayReportActivity.this, chart1, x_number, y_value, "chart1", x_value); //对比性柱状图 BarChartActivityUtils.init(DayReportActivity.this, chart2, x_number, y_value, "chart2", x_value); }
BarChartActivityOnlyUtils
package com.ts.policesituationj.mpandroidchars; import android.content.Context; import android.graphics.Color; import android.util.Log; import com.github.mikephil.charting.charts.BarChart; 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.formatter.IAxisValueFormatter; import com.github.mikephil.charting.formatter.LargeValueFormatter; import com.github.mikephil.charting.utils.ColorTemplate; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; public class BarChartActivityOnlyUtils { protected static BarChart mChart; /** * * @param context * @param mCharts * @param xAxisValues x_number * @param yAxisValues y_value * @param label 标题 * @param values x_value */ public static void init(Context context, BarChart mCharts , List<Float> xAxisValues, List<Float> yAxisValues, String label, String[] values){ mChart = mCharts; mChart.setDrawBarShadow(false); mChart.setDrawValueAboveBar(true); mChart.getDescription().setEnabled(false); // if more than 60 entries are displayed in the chart, no values will be // drawn mChart.setMaxVisibleValueCount(60); // scaling can now only be done on x- and y-axis separately mChart.setPinchZoom(false); mChart.setDrawGridBackground(false); //自定义x轴显示 XAxis xAxis = mChart.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.setDrawGridLines(false); xAxis.setGranularity(1f); // only intervals of 1 day xAxis.setLabelCount(7); MyXFormatter formatter = new MyXFormatter(values); xAxis.setValueFormatter(formatter); xAxis.setLabelCount(xAxisValues.size() - 1, false); IAxisValueFormatter custom = new MyAxisValueFormatter(); YAxis leftAxis = mChart.getAxisLeft(); leftAxis.setLabelCount(0, false); leftAxis.setValueFormatter(custom); leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART); leftAxis.setSpaceTop(15f); leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true) YAxis rightAxis = mChart.getAxisRight(); rightAxis.setDrawGridLines(false); rightAxis.setLabelCount(8, false); rightAxis.setValueFormatter(custom); rightAxis.setSpaceTop(15f); rightAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true) Legend l = mChart.getLegend(); l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT); l.setOrientation(Legend.LegendOrientation.HORIZONTAL); l.setDrawInside(false); l.setForm(Legend.LegendForm.SQUARE); l.setFormSize(9f); l.setTextSize(11f); l.setXEntrySpace(4f); XYMarkerView mv = new XYMarkerView(context, formatter); mv.setChartView(mChart); // For bounds control mChart.setMarker(mv); // Set the marker to the chart ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>(); ArrayList<BarEntry> yVals2 = new ArrayList<BarEntry>(); for (int i = 0; i < 10; i++) { yVals1.add(new BarEntry(i, yAxisValues.get(i))); yVals2.add(new BarEntry(i, yAxisValues.get(i)+20)); } BarDataSet set1; if (mChart.getData() != null && mChart.getData().getDataSetCount() > 0) { set1 = (BarDataSet) mChart.getData().getDataSetByIndex(0); set1.setValues(yVals1); mChart.getData().notifyDataChanged(); mChart.notifyDataSetChanged(); } else { set1 = new BarDataSet(yVals1, "A"); set1.setColors(ColorTemplate.MATERIAL_COLORS); BarData data = new BarData(set1); data.setValueFormatter(new LargeValueFormatter()); mChart.setData(data); } } }
需要辅助类
package com.ts.policesituationj.mpandroidchars; import com.github.mikephil.charting.components.AxisBase; import com.github.mikephil.charting.formatter.IAxisValueFormatter; import java.text.DecimalFormat; public class MyAxisValueFormatter implements IAxisValueFormatter { private DecimalFormat mFormat; public MyAxisValueFormatter() { mFormat = new DecimalFormat("###,###,###,##0.0"); } @Override public String getFormattedValue(float value, AxisBase axis) { return mFormat.format(value) + ""; } } package com.ts.policesituationj.mpandroidchars; import android.content.Context; import android.widget.TextView; import com.github.mikephil.charting.components.MarkerView; import com.github.mikephil.charting.data.CandleEntry; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.utils.MPPointF; import com.github.mikephil.charting.utils.Utils; import com.ts.policesituationj.R; /** * Custom implementation of the MarkerView. * * @author Philipp Jahoda */ public class MyMarkerView extends MarkerView { private TextView tvContent; public MyMarkerView(Context context, int layoutResource) { super(context, layoutResource); tvContent = findViewById(R.id.tvContent); } // callbacks everytime the MarkerView is redrawn, can be used to update the // content (user-interface) @Override public void refreshContent(Entry e, Highlight highlight) { if (e instanceof CandleEntry) { CandleEntry ce = (CandleEntry) e; tvContent.setText("" + Utils.formatNumber(ce.getHigh(), 0, true)); } else { tvContent.setText("" + Utils.formatNumber(e.getY(), 0, true)); } super.refreshContent(e, highlight); } @Override public MPPointF getOffset() { return new MPPointF(-(getWidth() / 2), -getHeight()); } } package com.ts.policesituationj.mpandroidchars; import android.util.Log; import com.github.mikephil.charting.components.AxisBase; import com.github.mikephil.charting.formatter.IAxisValueFormatter; public class MyXFormatter implements IAxisValueFormatter { private String[] mValues; public MyXFormatter(String[] values) { this.mValues = values; } private static final String TAG = "MyXFormatter"; @Override public String getFormattedValue(float value, AxisBase axis) { Log.d(TAG, "----->getFormattedValue: "+value); return mValues[(int) value % mValues.length]; } } package com.ts.policesituationj.mpandroidchars; import android.content.Context; import android.widget.TextView; import com.github.mikephil.charting.components.MarkerView; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.formatter.IAxisValueFormatter; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.utils.MPPointF; import com.ts.policesituationj.R; import java.text.DecimalFormat; /** * Custom implementation of the MarkerView. * * @author Philipp Jahoda */ public class XYMarkerView extends MarkerView { private TextView tvContent; private IAxisValueFormatter xAxisValueFormatter; private DecimalFormat format; public XYMarkerView(Context context, IAxisValueFormatter xAxisValueFormatter) { super(context, R.layout.custom_marker_view); this.xAxisValueFormatter = xAxisValueFormatter; tvContent = findViewById(R.id.tvContent); format = new DecimalFormat("###.0"); } // callbacks everytime the MarkerView is redrawn, can be used to update the // content (user-interface) @Override public void refreshContent(Entry e, Highlight highlight) { tvContent.setText("x: " + xAxisValueFormatter.getFormattedValue(e.getX(), null) + ", y: " + format.format(e.getY())); super.refreshContent(e, highlight); } @Override public MPPointF getOffset() { return new MPPointF(-(getWidth() / 2), -getHeight()); } }
一行代码 实现 MPAndroidChart 柱状图(2)
https://blog.csdn.net/a136447572/article/details/80438368