Android 图表开源框架之MPAndroidChart LineChart折线图(二)
Android 图表开源框架之MPAndroidChart LineChart之常用自定义设置功能
Android 图表开源框架之MPAndroidChart LineChart折线图,v3.0.1版本,MPAndroidChart是一款基于Android的开源图表库,MPAndroidChart不仅可以在Android设备上绘制各种统计图表,而且可以对图表进行拖动和缩放操作,应用起来非常灵活。MPAndroidChart显得更为轻巧和简单,拥有常用的图表类型:线型图、饼图、柱状图和散点图。
效果图:
一.简单实现:
1.添加依赖:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// implementation 'com.android.support:appcompat-v7:29.+'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.1'
// implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
2.主函数:
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Typeface;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import com.example.m1571.mympandroidchart.utils.CustomXValueFormatter;
import com.example.m1571.mympandroidchart.utils.MyMarkerView;
import com.github.mikephil.charting.animation.Easing;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
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.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.PercentFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
/**
*
* 图表开源框架
* https://blog.csdn.net/qq_43332570/article/details/103180779
*
*https://blog.csdn.net/qq_26787115/article/details/53611373
*
*
* https://www.jb51.net/article/142778.htm
* https://www.jb51.net/article/141344.htm
* https://www.jb51.net/article/96508.htm
*
* https://github.com/hdodenhof/CircleImageView
*/
public class MainActivity extends AppCompatActivity {
ArrayList pieEntryList = new ArrayList();//数据列表
ArrayList colors = new ArrayList();//颜色列表
private LineChart lineChart;
float datas[] = {14f,15f,16f,17f,16f,16f};
float datas2[] = {17f,16f,15f,14f,17f,14f};
//在MPAndroidChart一般都是通过List对象来装数据的
final List entries = new ArrayList();
final List entries2 = new ArrayList();
final List yRightList = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//渐变圆环
CircleProgressBar color_progress_view = (CircleProgressBar) findViewById(R.id.color_progress_view);
color_progress_view.setMaxStepNum(500);
color_progress_view.update(470, 2000);
//
//扇形图
final PieChart mChart = (PieChart) findViewById(R.id.chart1);
lineChart = (LineChart) findViewById(R.id.lineChart);
// initLineChart();
//曲线图 折线图
setData();
// 设置周围字体颜色
mChart.setCenterTextColor(Color.BLACK);
HashMap dataMap = new HashMap();
dataMap.put("Ⅰ类水", "8");
dataMap.put("Ⅱ类水", "12");
dataMap.put("Ⅲ类水", "31");
dataMap.put("Ⅳ类水", "24");
dataMap.put("Ⅴ类水", "10");
dataMap.put("劣Ⅴ类水", "15");
PieChartUtil.getPitChart().setPieChart(mChart, dataMap, "水质", true);
//点击事件
mChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
@Override
public void onValueSelected(Entry e, Highlight h) {
PieEntry pieEntry = (PieEntry) e;
mChart.setCenterText(pieEntry.getLabel());
}
@Override
public void onNothingSelected() {
}
});
// mChart.getDescription().setEnabled(false); //设置pieChart图表的描述
// mChart.setBackgroundColor(Color.WHITE); //设置pieChart图表背景色
// mChart.setRotationEnabled(true);//可以手动旋转
// mChart.setDragDecelerationFrictionCoef(0.95f);//设置pieChart图表转动阻力摩擦系数[0,1]
// mChart.setHighlightPerTapEnabled(true); //设置piecahrt图表点击Item高亮是否可用
// mChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);// 设置pieChart图表展示动画效果
// Legend l = mChart.getLegend();
// l.setEnabled(true); //是否启用图列(true:下面属性才有意义
// l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
// l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
// l.setOrientation(Legend.LegendOrientation.VERTICAL);
// l.setForm(Legend.LegendForm.DEFAULT); //设置图例的形状
// l.setFormSize(10); //设置图例的大小
// l.setFormToTextSpace(10f); //设置每个图例实体中标签和形状之间的间距
// l.setDrawInside(false);
// l.setWordWrapEnabled(true); //设置图列换行(注意使用影响性能,仅适用legend位于图表下面)
// l.setXEntrySpace(10f); //设置图例实体之间延X轴的间距(setOrientation = HORIZONTAL有效)
// l.setYEntrySpace(8f); //设置图例实体之间延Y轴的间距(setOrientation = VERTICAL 有效)
// l.setYOffset(0f); //设置比例块Y轴偏移量
// l.setTextSize(14f); //设置图例标签文本的大小
// l.setTextColor(Color.parseColor("#333333"));//设置图例标签文本的颜色
// for (int i = 0; i < pieEntryList.size(); i++) {//list为数据列表
// Random random = new Random();
// int r = random.nextInt(256);
// int g = random.nextInt(256);
// int b = random.nextInt(256);
// colors.add(Color.rgb(r,g,b));
// pieEntryList.add(new PieEntry(Float.parseFloat(townsChartEntity.getRecordSet0().getR().get(i).getC().get(2)) * 100 / all, townsChartEntity.getRecordSet0().getR().get(i).getC().get(1)));
// }
// //饼状图数据集 PieDataSet
// PieDataSet pieDataSet = new PieDataSet(pieEntryList, "图表名称");
// pieDataSet.setSliceSpace(3f); //设置饼状Item之间的间隙
// pieDataSet.setSelectionShift(30f); //设置饼状Item被选中时变化的距离
// pieDataSet.setColors(colors); //为DataSet中的数据匹配上颜色集(饼图Item颜色)
// //最终数据 PieData
// PieData pieData = new PieData(pieDataSet);
// pieData.setDrawValues(true); //设置是否显示数据实体(百分比,true:以下属性才有意义)
// pieData.setValueTextColor(Color.BLUE); //设置所有DataSet内数据实体(百分比)的文本颜色
// pieData.setValueTextSize(12f); //设置所有DataSet内数据实体(百分比)的文本字体大小
// pieData.setValueFormatter(new PercentFormatter());//设置所有DataSet内数据实体(百分比)的文本字体格式
//
// mChart.setData(pieData);
// mChart.highlightValues(null);
// mChart.invalidate(); //将图表重绘以显示设置的属性和数据
// PieData mPieData = getPieData(4, 100);
// showChart(mChart, mPieData);
//模拟数据
// HashMap dataMap = new HashMap();
// dataMap.put("A","300");
// dataMap.put("B","600");
// dataMap.put("C","500");
// dataMap.put("D","800");
//
// setPieChart(mChart,dataMap,"数据",true);
}
public void setData(){
yRightList.add("QQ");
yRightList.add("SS");
yRightList.add("VB");
yRightList.add("FF");
//循环取出数据
for(int i = 0; i < datas.length; i++){
entries.add(new Entry(i,datas[i]));
}
//循环取出数据
for(int i = 0; i < datas2.length; i++){
entries2.add(new Entry(i,datas2[i]));
}
//得到X轴
XAxis xAxis = lineChart.getXAxis();
//设置X轴的位置(默认在上方)
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
//不显示网格线
xAxis.setDrawGridLines(false);
//得到Y轴
YAxis yAxis = lineChart.getAxisLeft();
YAxis rightYAxis = lineChart.getAxisRight();
YAxis leftYAxis = lineChart.getAxisLeft();
//设置Y轴是否显示
rightYAxis.setEnabled(false); //右侧Y轴不显示
// leftYAxis.setEnabled(false); //左侧Y轴不显示
// 标签倾斜
xAxis.setLabelRotationAngle(45);
// setDesc();
// setLegend();
setXAxis();
setYAxis();
// 不显示数据描述
lineChart.getDescription().setEnabled(false);
// 没有数据的时候,显示“暂无数据”
lineChart.setNoDataText("暂无数据");
// 不显示表格颜色
lineChart.setDrawGridBackground(false);
// 不可以缩放
lineChart.setScaleEnabled(false);
// 不显示y轴右边的值
// lineChart.getAxisRight().setEnabled(false);
//设置X轴值为字符串
// xAxis.setValueFormatter(new IAxisValueFormatter() {
// @Override
// public String getFormattedValue(float value, AxisBase axis) {
// int IValue = (int) value;
// CharSequence format = DateFormat.format("MM/dd",
// System.currentTimeMillis() - (long) (entries.size() - IValue) * 24 * 60 * 60 * 1000);
// return format.toString();
// }
// });
//一个LineDataSet对象就是一条曲线
LineDataSet lineDataSet = new LineDataSet(entries,"第一条数据");
LineDataSet lineDataSet2 = new LineDataSet(entries2,"第二条数据");
// lineDataSet.setForm(Legend.LegendForm.LINE);
// lineDataSet.setFormLineWidth(10f);//只有lineDataSet.setForm(Legend.LegendForm.LINE);时才有作用 这里我们设置的是圆所以这句代码直接注释
// lineDataSet.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));//设置虚线,只有lineDataSet.setForm(Legend.LegendForm.LINE);时才有作用
lineDataSet2.setColor(Color.BLUE);//设置曲线的颜色
// lineDataSet.setFillColor(Color.GRAY);//设置线条下方的填充
//设置显示曲线下方的背景色
// lineDataSet.setDrawFilled(true);
//给曲线下方设置渐变色的阴影
// lineDataSet.setFillDrawable(getResources().getDrawable(R.drawable.line_gradient_bg_shape));//设置线条下方的填充
//折线图点的标记
MyMarkerView mv = new MyMarkerView(this);
lineChart.setMarker(mv);
//保存LineDataSet集合
ArrayList dataSets = new ArrayList<>();
dataSets.add(lineDataSet); // add the datasets
dataSets.add(lineDataSet2);
//LineData才是正真给LineChart的数据
// LineData lineData = new LineData(lineDataSet);//一条曲线
LineData lineData = new LineData(dataSets);//多条曲线
lineChart.setData(lineData);
// animateX(int durationMillis) : 水平轴动画 在指定时间内 从左到右
// animateY(int durationMillis) : 垂直轴动画 从下到上
// animateXY(int xDuration, int yDuration) : 两个轴动画,从左到右,从下到上
// lineChart.animateXY(1000,1000);
lineChart.animateX(1000);
}
public void setDesc(){
Description description = new Description();
description.setText("这是折线图的标题");//设置文本
description.setTextSize(22f); //设置文本大小
description.setTypeface(Typeface.DEFAULT_BOLD);//设置文本样式加粗显示
description.setTextColor(Color.RED);//设置文本颜色
//获取屏幕的中间位置
WindowManager wm=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
float x = dm.widthPixels / 2;
description.setPosition(x,40);//设置文本的位置
lineChart.setDescription(description);//添加给LineChart
}
public void setLegend(){
//为了让大家更直观的看到效果,我这里设置了整个图形距离上下左右四个方向的边距
//在后面会讲解
lineChart.setExtraOffsets(30,60,30,30);
//得到Legend对象
Legend legend = lineChart.getLegend();
legend.setDrawInside(false);//不绘制在图形内部
legend.setTextSize(38f);//设置文字大小
legend.setTypeface(Typeface.DEFAULT_BOLD);//文字加粗
legend.setFormSize(50f);//设置图例的大小
legend.setTextColor(Color.BLUE);//设置文字颜色
legend.setFormToTextSpace(20f);//设置图例距离文字的距离
legend.setForm(Legend.LegendForm.LINE);//设置图例类型为线条
legend.setYOffset(20f);//距离底部20dp
//设置图例下、中对齐
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
}
//此方法在onCreate中直接调用即可, 下方会给出完整代码
public void setYAxis(){
//不显示右侧的Y轴
lineChart.getAxisRight().setEnabled(true);
lineChart.getAxisLeft().setEnabled(true);
YAxis yAxis = lineChart.getAxisRight();
YAxis yAxisL = lineChart.getAxisLeft();
//右侧Y轴数据设置
// yAxis.setLabelCount(7,true);//显示7个
// yAxis.setAxisMaximum(19f);//设置最大值
// yAxis.setAxisMinimum(9f);//设置最小值
yAxis.setTextSize(14f);//设置文本大小
yAxis.setXOffset(15);//设置15dp的距离
yAxis.setDrawAxisLine(false);//设置左侧Y线不显示
yAxis.setLabelCount(4,true);//设置Y轴显示多少个点
yAxis.setAxisMaximum(17f);//设置左侧Y轴最大值
yAxis.setAxisMinimum(14f);//设置左侧Y轴最小值
//左侧Y轴数据设置
yAxisL.setTextSize(14f);//设置文本大小
yAxisL.setXOffset(15);//设置15dp的距离
yAxisL.setDrawAxisLine(false);//设置左侧Y线不显示
yAxisL.setLabelCount(4,true);//设置Y轴显示多少个点
yAxisL.setAxisMaximum(17f);//设置左侧Y轴最大值
yAxisL.setAxisMinimum(14f);//设置左侧Y轴最小值
// LimitLine ll2 = new LimitLine(8f, "");
// ll2.setLineWidth(3f);
// ll2.setLineColor(ContextCompat.getColor(this, android.R.color.black));
// ll2.enableDashedLine(5f, 5f, 0f);//虚线
// ll2.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_TOP);//设置标签显示的位置
// ll2.setTextColor(ContextCompat.getColor(this, android.R.color.background_dark));
// ll2.setTextSize(10f);
// yAxis.setInverted(false);
// yAxis.setGridLineWidth(2);//设置分割线宽度
//自定义格式
// yAxis.setValueFormatter(new IAxisValueFormatter() {
// @Override
// public String getFormattedValue(float value, AxisBase axis) {
if(value == 9){
return "(S)";
}
// ArrayList arrayList = new ArrayList<>();
// arrayList.add("中国");
// arrayList.add("中国1");
// arrayList.add("中国2");
// arrayList.add("中国3");
// arrayList.add("中国4");
// String tep = null;
// for (int i = 0; i < arrayList.size(); i++) {
// tep = arrayList.get(i) + "";
// }
String tep = value + "";
return tep.substring(0,tep.indexOf(".")) + "℃";
// return tep;
// }
// });
//设置左侧Y轴的数据
yAxisL.setValueFormatter(new CustomXValueFormatter(yRightList));
}
public void setXAxis() {
XAxis xAxis = lineChart.getXAxis();
xAxis.setTextSize(14f);//设置字体大小
xAxis.setTextColor(Color.RED);//设置字体颜色
xAxis.setLabelRotationAngle(60f);//旋转60度
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//将x轴位于底部
xAxis.setDrawGridLines(false);//不绘制网格线
xAxis.setGranularity(1);//间隔1
//小技巧,通过设置Axis的最小值设置为负值
//可以改变距离与Y轴的距离
final String weeks[] = {"昨天","今天","明天","周五","周六","周日"};
xAxis.setAxisMaximum(5.2f);//设置最小值
xAxis.setAxisMinimum(-0.2f);//设置最大值
xAxis.setLabelCount(weeks.length);//设置数量
xAxis.setTextColor(Color.BLACK);
//自定义样式
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return weeks[(int) value];
}
});
}
private void initLineChart() {
List arrayList = new ArrayList<>();
arrayList.add(90);
arrayList.add(90);
arrayList.add(90);
arrayList.add(90);
arrayList.add(90);
initLineChart(arrayList);
}
/**
* 初始化曲线图表
*
* @param list 数据集
*/
private void initLineChart(final List list)
{
//显示边界
lineChart.setDrawBorders(false);
//设置数据
List entries = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
entries.add(new Entry(i, (float) list.get(i)));
}
//一个LineDataSet就是一条线
LineDataSet lineDataSet = new LineDataSet(entries, "");
//线颜色
lineDataSet.setColor(Color.parseColor("#F15A4A"));
//线宽度
lineDataSet.setLineWidth(1.6f);
//不显示圆点
lineDataSet.setDrawCircles(false);
//线条平滑
lineDataSet.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
//设置折线图填充
// lineDataSet.setDrawFilled(true);
LineData data = new LineData(lineDataSet);
//无数据时显示的文字
lineChart.setNoDataText("暂无数据");
//折线图不显示数值
data.setDrawValues(false);
//得到X轴
XAxis xAxis = lineChart.getXAxis();
//设置X轴的位置(默认在上方)
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
//设置X轴坐标之间的最小间隔
xAxis.setGranularity(1f);
//设置X轴的刻度数量,第二个参数为true,将会画出明确数量(带有小数点),但是可能值导致不均匀,默认(6,false)
xAxis.setLabelCount(list.size() / 6, false);
//设置X轴的值(最小值、最大值、然后会根据设置的刻度数量自动分配刻度显示)
xAxis.setAxisMinimum(0f);
xAxis.setAxisMaximum((float) list.size());
//不显示网格线
xAxis.setDrawGridLines(false);
// 标签倾斜
xAxis.setLabelRotationAngle(45);
//设置X轴值为字符串
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
int IValue = (int) value;
CharSequence format = DateFormat.format("MM/dd",
System.currentTimeMillis() - (long) (list.size() - IValue) * 24 * 60 * 60 * 1000);
return format.toString();
}
});
//得到Y轴
YAxis yAxis = lineChart.getAxisLeft();
YAxis rightYAxis = lineChart.getAxisRight();
//设置Y轴是否显示
rightYAxis.setEnabled(false); //右侧Y轴不显示
//设置y轴坐标之间的最小间隔
//不显示网格线
yAxis.setDrawGridLines(false);
//设置Y轴坐标之间的最小间隔
yAxis.setGranularity(1);
//设置y轴的刻度数量
//+2:最大值n就有n+1个刻度,在加上y轴多一个单位长度,为了好看,so+2
yAxis.setLabelCount(Collections.max(list) + 2, false);
//设置从Y轴值
yAxis.setAxisMinimum(0f);
//+1:y轴多一个单位长度,为了好看
yAxis.setAxisMaximum(Collections.max(list) + 1);
//y轴
yAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
int IValue = (int) value;
return String.valueOf(IValue);
}
});
//图例:得到Lengend
Legend legend = lineChart.getLegend();
//隐藏Lengend
legend.setEnabled(false);
//隐藏描述
Description description = new Description();
description.setEnabled(false);
lineChart.setDescription(description);
//折线图点的标记
MyMarkerView mv = new MyMarkerView(this);
lineChart.setMarker(mv);
//设置数据
lineChart.setData(data);
//图标刷新
lineChart.invalidate();
//解决滑动冲突
lineChart.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
// scrollview.requestDisallowInterceptTouchEvent(true);
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: {
// scrollview.requestDisallowInterceptTouchEvent(false);
break;
}
}
return false;
}
});
}
//设置各区块的颜色
public static final int[] PIE_COLORS = {
Color.rgb(181, 194, 202), Color.rgb(129, 216, 200), Color.rgb(241, 214, 145),
Color.rgb(108, 176, 223), Color.rgb(195, 221, 155), Color.rgb(251, 215, 191),
Color.rgb(237, 189, 189), Color.rgb(172, 217, 243)
};
//设置饼形图属性
public void setPieChart(PieChart pieChart, Map pieValues, String title, boolean showLegend) {
pieChart.setUsePercentValues(true);//设置使用百分比(后续有详细介绍)
pieChart.getDescription().setEnabled(false);//设置描述
pieChart.setExtraOffsets(25, 10, 25, 25); //设置边距
pieChart.setDragDecelerationFrictionCoef(0.95f);//设置摩擦系数(值越小摩擦系数越大)
pieChart.setCenterText(title);//设置环中的文字
pieChart.setRotationEnabled(true);//是否可以旋转
pieChart.setHighlightPerTapEnabled(true);//点击是否放大
pieChart.setCenterTextSize(22f);//设置环中文字的大小
pieChart.setDrawCenterText(true);//设置绘制环中文字
pieChart.setRotationAngle(120f);//设置旋转角度
pieChart.setTransparentCircleRadius(61f);//设置半透明圆环的半径,看着就有一种立体的感觉
//这个方法为true就是环形图,为false就是饼图
pieChart.setDrawHoleEnabled(false);
//设置环形中间空白颜色是白色
pieChart.setHoleColor(Color.WHITE);
//设置半透明圆环的颜色
pieChart.setTransparentCircleColor(Color.WHITE);
//设置半透明圆环的透明度
pieChart.setTransparentCircleAlpha(110);
//图例设置
Legend legend = pieChart.getLegend();
if (showLegend) {
legend.setEnabled(true);//是否显示图例
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);//图例相对于图表横向的位置
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);//图例相对于图表纵向的位置
legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);//图例显示的方向
legend.setDrawInside(false);
legend.setDirection(Legend.LegendDirection.LEFT_TO_RIGHT);
} else {
legend.setEnabled(false);
}
//设置饼图数据
setPieChartData(pieChart, pieValues);
pieChart.animateX(1500, Easing.EasingOption.EaseInOutQuad);//数据显示动画
}
//设置饼图数据
private void setPieChartData(PieChart pieChart, Map pieValues) {
ArrayList xValues = new ArrayList(); //xVals用来表示每个饼块上的内容
for (int i = 0; i < 4; i++) {
xValues.add("Quarterly" + (i + 1)); //饼块上显示成Quarterly1, Quarterly2, Quarterly3, Quarterly4
}
ArrayList yValues = new ArrayList(); //yVals用来表示封装每个饼块的实际数据
// 饼图数据
/**
* 将一个饼形图分成四部分, 四部分的数值比例为14:14:34:38
* 所以 14代表的百分比就是14%
*/
float quarterly1 = 14;
float quarterly2 = 14;
float quarterly3 = 34;
float quarterly4 = 38;
yValues.add(new Entry(quarterly1, 0));
yValues.add(new Entry(quarterly2, 1));
yValues.add(new Entry(quarterly3, 2));
yValues.add(new Entry(quarterly4, 3));
// Set set = pieValues.entrySet();
// Iterator it = set.iterator();
// while (it.hasNext()) {
// Map.Entry entry = (Map.Entry) it.next();
// entries.add(new PieEntry(Float.valueOf(entry.getValue().toString()), entry.getKey().toString()));
// }
PieDataSet dataSet = new PieDataSet(yValues, "");
dataSet.setSliceSpace(3f);//设置饼块之间的间隔
dataSet.setSelectionShift(5f);//设置饼块选中时偏离饼图中心的距离
dataSet.setColors(PIE_COLORS);//设置饼块的颜色
//设置数据显示方式有见图
dataSet.setValueLinePart1OffsetPercentage(80f);//数据连接线距图形片内部边界的距离,为百分数
dataSet.setValueLinePart1Length(0.3f);
dataSet.setValueLinePart2Length(0.4f);
dataSet.setValueLineColor(Color.YELLOW);//设置连接线的颜色
dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
PieData pieData = new PieData(dataSet);
pieData.setValueFormatter(new PercentFormatter());
pieData.setValueTextSize(11f);
pieData.setValueTextColor(Color.DKGRAY);
pieChart.setData(pieData);
pieChart.highlightValues(null);
pieChart.invalidate();
}
private void initPieChart() {
// PieChart mChart = (PieChart) findViewById(R.id.spread_pie_chart);
// PieData mPieData = getPieData(4, 100);
// showChart(mChart, mPieData);
}
private void showChart(PieChart pieChart, PieData pieData) {
// pieChart.setHoleColorTransparent(true);
pieChart.setHoleRadius(60f); //半径
pieChart.setTransparentCircleRadius(64f); // 半透明圈
//pieChart.setHoleRadius(0); //实心圆
// pieChart.setDescription("测试饼状图");
// mChart.setDrawYValues(true);
pieChart.setDrawCenterText(true); //饼状图中间可以添加文字
pieChart.setDrawHoleEnabled(true);
pieChart.setRotationAngle(90); // 初始旋转角度
// draws the corresponding description value into the slice
// mChart.setDrawXValues(true);
// enable rotation of the chart by touch
pieChart.setRotationEnabled(true); // 可以手动旋转
// display percentage values
pieChart.setUsePercentValues(true); //显示成百分比
// mChart.setUnit(" €");
// mChart.setDrawUnitsInChart(true);
// add a selection listener
// mChart.setOnChartValueSelectedListener(this);
// mChart.setTouchEnabled(false);
// mChart.setOnAnimationListener(this);
pieChart.setCenterText("Quarterly Revenue"); //饼状图中间的文字
//设置数据
pieChart.setData(pieData);
// undo all highlights
// pieChart.highlightValues(null);
// pieChart.invalidate();
Legend mLegend = pieChart.getLegend(); //设置比例图
mLegend.setPosition(Legend.LegendPosition.RIGHT_OF_CHART); //最右边显示
// mLegend.setForm(LegendForm.LINE); //设置比例图的形状,默认是方形
mLegend.setXEntrySpace(7f);
mLegend.setYEntrySpace(5f);
// Legend l = mChart.getLegend();
// l.setEnabled(true); //是否启用图列(true:下面属性才有意义
// l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
// l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
// l.setOrientation(Legend.LegendOrientation.VERTICAL);
// l.setForm(Legend.LegendForm.DEFAULT); //设置图例的形状
// l.setFormSize(10); //设置图例的大小
// l.setFormToTextSpace(10f); //设置每个图例实体中标签和形状之间的间距
// l.setDrawInside(false);
// l.setWordWrapEnabled(true); //设置图列换行(注意使用影响性能,仅适用legend位于图表下面)
// l.setXEntrySpace(10f); //设置图例实体之间延X轴的间距(setOrientation = HORIZONTAL有效)
// l.setYEntrySpace(8f); //设置图例实体之间延Y轴的间距(setOrientation = VERTICAL 有效)
// l.setYOffset(0f); //设置比例块Y轴偏移量
// l.setTextSize(14f); //设置图例标签文本的大小
// l.setTextColor(Color.parseColor("#333333"));//设置图例标签文本的颜色
pieChart.animateXY(1000, 1000); //设置动画
// mChart.spin(2000, 0, 360);
}
/**
* @param count 分成几部分
* @param range
*/
private PieData getPieData(int count, float range) {
ArrayList xValues = new ArrayList(); //xVals用来表示每个饼块上的内容
for (int i = 0; i < count; i++) {
xValues.add("Quarterly" + (i + 1)); //饼块上显示成Quarterly1, Quarterly2, Quarterly3, Quarterly4
}
ArrayList yValues = new ArrayList(); //yVals用来表示封装每个饼块的实际数据
// 饼图数据
/**
* 将一个饼形图分成四部分, 四部分的数值比例为14:14:34:38
* 所以 14代表的百分比就是14%
*/
float quarterly1 = 14;
float quarterly2 = 14;
float quarterly3 = 34;
float quarterly4 = 38;
yValues.add(new Entry(quarterly1, 0));
yValues.add(new Entry(quarterly2, 1));
yValues.add(new Entry(quarterly3, 2));
yValues.add(new Entry(quarterly4, 3));
//y轴的集合
PieDataSet pieDataSet = new PieDataSet(yValues, "Quarterly Revenue 2014"/*显示在比例图上*/);
pieDataSet.setSliceSpace(0f); //设置个饼状图之间的距离
ArrayList colors = new ArrayList();
// 饼图颜色
colors.add(Color.rgb(205, 205, 205));
colors.add(Color.rgb(114, 188, 223));
colors.add(Color.rgb(255, 123, 124));
colors.add(Color.rgb(57, 135, 200));
pieDataSet.setColors(colors);
DisplayMetrics metrics = getResources().getDisplayMetrics();
float px = 5 * (metrics.densityDpi / 160f);
pieDataSet.setSelectionShift(px); // 选中态多出的长度
// PieData pieData = new PieData(xValues, pieDataSet);
PieData pieData = new PieData(pieDataSet);
pieData.setDrawValues(true);
return pieData;
}
}
2.主函数布局:(请忽略其它的自定义控件)
3.自定义MyMarkerView提示内容框:
import android.content.Context;
import android.text.format.DateFormat;
import android.widget.TextView;
import com.example.m1571.mympandroidchart.R;
import com.github.mikephil.charting.components.MarkerView;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.utils.MPPointF;
import java.text.DecimalFormat;
public class MyMarkerView extends MarkerView
{
private TextView tvContent;
private DecimalFormat format = new DecimalFormat("##0");
public MyMarkerView(Context context) {
super(context, R.layout.layout_markerview);//这个布局自己定义
tvContent = (TextView) findViewById(R.id.tvContent);
}
//显示的内容
@Override
public void refreshContent(Entry e, Highlight highlight) {
// tvContent.setText(format(e.getX())+"\n"+format.format(e.getY())+"辆");
tvContent.setText(format.format(e.getY())+"辆");
super.refreshContent(e, highlight);
}
//标记相对于折线图的偏移量
@Override
public MPPointF getOffset() {
return new MPPointF(-(getWidth() / 2), -getHeight());
}
//时间格式化(显示今日往前30天的每一天日期)
public String format(float x)
{
CharSequence format = DateFormat.format("MM月dd日",
System.currentTimeMillis()-(long) (30-(int)x)*24*60*60*1000);
return format.toString();
}
}
4.layout_markerview.xml布局:
5.背景色:bg_shape_c.xml
6.参考案例:
https://github.com/897532167/ChartManager
https://github.com/PhilJay/MPAndroidChart
https://github.com/lecho/hellocharts-android
https://github.com/JinBoy23520/MPAndroidChartDemoByJin
https://blog.csdn.net/qq_43332570/article/details/103180779
https://blog.csdn.net/xiehuimx/article/details/51731649
https://blog.csdn.net/dt235201314/article/details/56841839
https://blog.csdn.net/y1010012836/article/details/88532938?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase
https://blog.csdn.net/cf8833/article/details/80076175
https://www.jb51.net/article/91174.htm
https://blog.csdn.net/cf8833/article/details/79987051?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4
https://blog.csdn.net/StramChen/article/details/89875600?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
https://blog.csdn.net/Dr_abandon/article/details/88819160?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1