實現柱狀圖與條形圖的結合,MPAndroidChart 的簡單使用
先貼效果圖:
這種樣式的統計表格也是比較常用的,下面直接貼代碼:
public class ChartActivity extends BaseActivity {
@BindView(R.id.chart1)
MyCombinedChart mChart1;//完成情況
private final int itemcount = 3;
protected String[] mMonths = new String[]{"張三", "李四", "王五"};//X軸標簽
private List<Float> lineDatas;//線圖數據源
private List<float[]> barDatas;//堆圖數據源
@Override
public void init(Bundle savedInstanceState) {
setContentView(R.layout.<em>activity_chart</em>,this);
initTitleBar(R.id.<em>title</em>,"報表");
setChart1();
}
<em>/** </em><em> * 配置維修單完成情況 </em><em> */ </em><em> </em>private void setChart1() {
configChart(mChart1);
}
private void configChart(MyCombinedChart mChart){
mChart.setDrawValueAboveBar(false);
mChart.getDescription().setEnabled(false);//不顯示表名
// mChart.getDescription().setPosition();//設置表名在屏幕中的位置
mChart.setBackgroundColor(Color.WHITE);
mChart.setDrawGridBackground(false);
mChart.setDrawBarShadow(false);
mChart.setScaleYEnabled(false);//Y軸方向上不允許拉伸
mChart.setHighlightFullBarEnabled(false);
// draw bars behind lines設置繪制順序,重疊部分的圖案后繪制的會遮擋先繪制的
mChart.setDrawOrder(new CombinedChart.DrawOrder[]{
CombinedChart.DrawOrder.<em>BAR</em>, CombinedChart.DrawOrder.<em>LINE </em><em> </em>});
//圖例
Legend l = mChart.getLegend();
l.setWordWrapEnabled(true);
l.setVerticalAlignment(Legend.LegendVerticalAlignment.<em>BOTTOM</em>);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.<em>CENTER</em>);
l.setOrientation(Legend.LegendOrientation.<em>HORIZONTAL</em>);
l.setDrawInside(false);
//設置右邊Y軸標簽
YAxis rightAxis = mChart.getAxisRight();
rightAxis.setAxisMaximum(100);//設置最大數值
rightAxis.setLabelCount(6, true);//設置標簽數量
rightAxis.setValueFormatter(new MyAxisValueFormatter());//設置數值顯示格式
rightAxis.setDrawGridLines(true);//繪制網格線
rightAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
//設置左邊Y軸標簽
YAxis leftAxis = mChart.getAxisLeft();
leftAxis.setAxisMaximum(20);
leftAxis.setLabelCount(6, true);
leftAxis.setDrawGridLines(true);
leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
//設置X軸標簽
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.<em>BOTTOM</em>);
xAxis.setAxisMinimum(0f);
xAxis.setGranularity(1f);
xAxis.setDrawGridLines(false);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
if (value==0||value==mMonths.length+1){
return "";
}
return mMonths[(int) (value-1) % mMonths.length];
}
@Override
public int getDecimalDigits() {
return 0;
}
});
CombinedData data = new CombinedData();
data.setData(generateBarData());
data.setData(generateLineData());
//設置字體樣式
// data.setValueTypeface(mTfLight);
xAxis.setAxisMaximum(data.getXMax() + 1);//最大寬度另加1個單元格的寬度
mChart.setData(data);
mChart.invalidate();
}
private LineData generateLineData() {
lineDatas = new ArrayList<>();
for (int i = 0; i < barDatas.size(); i++) {
lineDatas.add(barDatas.get(i)[0] / (plus(barDatas.get(i))) * 100);
}
LineData d = new LineData();
ArrayList<Entry> entries = new ArrayList<Entry>();
//傳入數據
for (int index = 0; index < itemcount; index++)
entries.add(new Entry(index + 1, lineDatas.get(index)));
LineDataSet set = new LineDataSet(entries, "完成率");
set.setColor(getResources().getColor(R.color.<em>chart_green</em>));
set.setLineWidth(2.5f);
set.setCircleColor(Color.<em>rgb(240, 238, 70)); set.setCircleRadius(5f); set.setFillColor(Color.<em>rgb(240, 238, 70)); set.setMode(LineDataSet.Mode.<em>LINEAR</em>); set.setDrawValues(true); set.setValueTextSize(10f); set.setValueTextColor(getResources().getColor(R.color.<em>black</em>));//設置內容字體顏色 set.setAxisDependency(YAxis.AxisDependency.<em>RIGHT</em>);//以右邊Y軸的標簽繪制 d.addDataSet(set); MyValueFormatter format = new MyValueFormatter(); d.setValueFormatter(format); return d; } private float plus(float[] f) { float plus = 0; for (float aF : f) { plus += aF; } return plus; } private BarData generateBarData() { barDatas = new ArrayList<>(); barDatas.add(new float[]{6, 8}); barDatas.add(new float[]{15, 4}); barDatas.add(new float[]{11, 7}); ArrayList<BarEntry> entries2 = new ArrayList<>(); for (int index = 0; index < itemcount; index++) { // stacked entries2.add(new BarEntry(index + 1, barDatas.get(index))); } BarDataSet set2 = new BarDataSet(entries2, ""); set2.setStackLabels(new String[]{"已完成", "未完成"}); set2.setColors(getResources().getColor(R.color.<em>chart_blue</em>),getResources().getColor(R.color.<em>chart_red</em>)); set2.setValueTextColor(getResources().getColor(R.color.<em>black</em>)); set2.setValueTextSize(10f); set2.setAxisDependency(YAxis.AxisDependency.<em>LEFT</em>);//以左邊Y軸的標簽繪制 float barWidth = 0.45f; // x2 dataset BarData d = new BarData(set2); d.setBarWidth(barWidth); return d; }</em></em></code></pre>
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) + "%";
}
//小數點后數字個數
@Override
public int getDecimalDigits() {
return 0;
}
}</code></pre>
class MyValueFormatter implements IValueFormatter
{
private DecimalFormat mFormat;
public MyValueFormatter() {
mFormat = new DecimalFormat("###,###,###,##0.0");
}
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
//百分比顯示
return mFormat.format(value)+ "%" ;
}
}</code></pre>
class MyYAxis extends YAxis {
public MyYAxis() {
super();
}
public MyYAxis(AxisDependency position) {
super(position);
}
@Override
public String getFormattedLabel(int index) {
if (index < 0 || index >= mEntries.length)
return "";
else {
float max=mEntries[0];
for (int i=1;i<mEntries.length;i++){
Log.d("test", "getFormattedLabel: "+mEntries[i]);
if (mEntries[i]>max){
max=mEntries[i];
}
}
return getValueFormatter().getFormattedValue(mEntries[index] /max*100, this);
}
}
}</code></pre>
}
public class MyCombinedChart extends CombinedChart {
public MyCombinedChart(Context context) {
super(context);
}
public MyCombinedChart(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyCombinedChart(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public YAxis getAxisRight() {
return super.getAxisRight();
}
@Override
protected void init() {
super.init();
mAxisLeft = new YAxis(YAxis.AxisDependency.<em>LEFT</em>);
mAxisRight = new MyYAxis(MyYAxis.AxisDependency.<em>RIGHT</em>);
mLeftAxisTransformer = new Transformer(mViewPortHandler);
mRightAxisTransformer = new Transformer(mViewPortHandler);
mAxisRendererLeft = new YAxisRenderer(mViewPortHandler, mAxisLeft, mLeftAxisTransformer);
mAxisRendererRight = new YAxisRenderer(mViewPortHandler, mAxisRight, mRightAxisTransformer);
mXAxisRenderer = new XAxisRenderer(mViewPortHandler, mXAxis, mLeftAxisTransformer);
setHighlighter(new ChartHighlighter(this));
mChartTouchListener = new BarLineChartTouchListener(this, mViewPortHandler.getMatrixTouch(), 3f);
mGridBackgroundPaint = new Paint();
mGridBackgroundPaint.setStyle(Paint.Style.<em>FILL</em>);
// mGridBackgroundPaint.setColor(Color.WHITE);
mGridBackgroundPaint.setColor(Color.<em>rgb(240, 240, 240)); // light // grey mBorderPaint = new Paint(); mBorderPaint.setStyle(Paint.Style.<em>STROKE</em>); mBorderPaint.setColor(Color.<em>BLACK</em>); mBorderPaint.setStrokeWidth(Utils.<em>convertDpToPixel(1f)); } }</em></em></code></pre>
來自:http://blog.csdn.net/dovar_66/article/details/53063420
本文由用戶 2196231334 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!