下面是关于“Android动态绘制饼状图的示例代码”的完整攻略,包含两条示例说明。
示例一:使用Android Graphics绘制饼状图
1. 绘制饼状图基本思路
我们可以通过Android Graphics来绘制饼状图。具体的步骤包括:
- 根据数据计算每个扇形所占的角度;
- 根据半径和圆心位置,绘制圆弧;
- 绘制圆弧上的数据说明。
2. 示例代码
通过如下代码,我们可以实现一个简单的饼状图。
public class PieChartView extends View {
// 饼状图数据
private List<PieData> mData;
// View宽高
private int mWidth, mHeight;
// 饼状图半径
private float mRadius;
// 饼状图中心位置
private float mCenterX, mCenterY;
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
public PieChartView(Context context) {
this(context, null);
}
public PieChartView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public void setData(List<PieData> data) {
this.mData = data;
postInvalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = MeasureSpec.getSize(widthMeasureSpec);
mHeight = MeasureSpec.getSize(heightMeasureSpec);
mRadius = Math.min(mWidth, mHeight) / 2 * 0.8f;
mCenterX = mWidth / 2f;
mCenterY = mHeight / 2f;
setMeasuredDimension(mWidth, mHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mData == null || mData.size() == 0) {
return;
}
// 计算总数,为了表现百分比
float sumValue = 0;
for (int i = 0; i < mData.size(); i++) {
PieData pie = mData.get(i);
sumValue += pie.getValue();
}
float startAngle = 0;
for (int i = 0; i < mData.size(); i++) {
PieData pie = mData.get(i);
mPaint.setColor(pie.getColor());
// 绘制扇形
float sweepAngle = pie.getValue() / sumValue * 360;
canvas.drawArc(new RectF(mCenterX - mRadius, mCenterY - mRadius,
mCenterX + mRadius, mCenterY + mRadius), startAngle, sweepAngle, true, mPaint);
// 绘制文本
float textAngle = startAngle + sweepAngle / 2;
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(24f);
float textX = (float) (mCenterX + (mRadius / 2 + 24) * Math.cos(textAngle * Math.PI / 180));
float textY = (float) (mCenterY + (mRadius / 2 + 24) * Math.sin(textAngle * Math.PI / 180));
canvas.drawText(pie.getName(), textX, textY, mPaint);
// 更新起点角度
startAngle += sweepAngle;
}
}
/**
* 饼状图数据
*/
public static class PieData {
// 数据值
private float value;
// 数据名称
private String name;
// 数据颜色
private int color;
public PieData(float value, String name, int color) {
this.value = value;
this.name = name;
this.color = color;
}
//省略 getter 和 setter 方法
}
}
以上代码中,我们使用了View来绘制饼状图,通过onMeasure()方法获取View的宽高,通过onDraw()方法绘制饼状图和每个扇形上的数据说明,通过设置setData()方法,来设置饼状图的数据。
示例二:使用第三方库MPAndroidChart绘制饼状图
如果图形复杂或者数据量很大时,我们可以使用第三方库来完成。这里我们使用MPAndroidChart库来实现。
1. 饼状图基本思路
我们可以通过MPAndroidChart库来绘制饼状图。具体的步骤包括:
- 添加MPAndroidChart库依赖;
- 绘制饼状图。
2. 示例代码
通过如下代码,我们可以实现一个简单的饼状图。
- 首先,在app的build.gradle文件中,添加依赖:
dependencies {
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
}
- 在布局文件中添加PieChart控件:
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/pie_chart"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- 在代码中,对PieChart进行配置:
public class PieChartActivity extends AppCompatActivity {
private PieChart mPieChart;
private List<PieEntry> mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pie_chart);
mPieChart = findViewById(R.id.pie_chart);
// 饼状图实体
mData = new ArrayList<>();
mData.add(new PieEntry(25, "北京"));
mData.add(new PieEntry(20, "上海"));
mData.add(new PieEntry(15, "广州"));
mData.add(new PieEntry(10, "深圳"));
mData.add(new PieEntry(30, "其他"));
PieDataSet dataSet = new PieDataSet(mData, "城市分布");
dataSet.setColors(ColorTemplate.COLORFUL_COLORS);
PieData data = new PieData(dataSet);
// 对饼状图进行配置
mPieChart.setUsePercentValues(true);
mPieChart.getDescription().setEnabled(false);
mPieChart.setExtraOffsets(5, 10, 5, 5);
mPieChart.setDrawHoleEnabled(true);
mPieChart.setHoleColor(Color.WHITE);
mPieChart.setHoleRadius(58f);
mPieChart.setTransparentCircleRadius(61f);
mPieChart.setDrawCenterText(true);
mPieChart.setCenterText("城市分布");
mPieChart.setCenterTextSize(16f);
mPieChart.setData(data);
mPieChart.invalidate();
}
}
以上代码中,我们使用了MPAndroidChart库中的PieChart控件,通过PieDataSet和PieData的方式来设置数据和颜色,通过setXxx()方法来对饼状图进行配置。
这是关于Android动态绘制饼状图的示例代码的完整攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android动态绘制饼状图的示例代码 - Python技术站