MPAndroidChart 一行代码 实现 柱状图(1)
程序员文章站
2024-02-15 12:01:11
...
导入 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