android 自定义 View 实现圆饼不同扇形区域颜色以及点击事件的代码
以下是一个自定义 View 实现圆饼不同扇形区域颜色以及点击事件的示例代码:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class PieChartView extends View {
private int[] colors = {Color.RED, Color.BLUE, Color.GREEN};
private float[] data = {30, 40, 30}; // 每个扇形区域的数据比例
private RectF pieRectF; // 圆饼的矩形区域
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private int selectedIndex = -1; // 选中的扇形区域索引
public PieChartView(Context context) {
super(context);
}
public PieChartView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PieChartView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (data.length == 0) {
return;
}
float startAngle = 0;
pieRectF = new RectF(0, 0, getWidth(), getHeight());
for (int i = 0; i < data.length; i++) {
paint.setColor(colors[i]);
// 计算每个扇形区域的角度
float sweepAngle = 360 * (data[i] / 100);
// 绘制扇形区域
canvas.drawArc(pieRectF, startAngle, sweepAngle, true, paint);
// 如果选中的扇形区域,绘制选中效果
if (i == selectedIndex) {
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
canvas.drawArc(pieRectF, startAngle, sweepAngle, true, paint);
}
// 更新下一个扇形区域的起始角度
startAngle += sweepAngle;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float x = event.getX();
float y = event.getY();
// 计算点击的点与圆心的距离
float distance = (float) Math.sqrt((x - getWidth() / 2) * (x - getWidth() / 2)
+ (y - getHeight() / 2) * (y - getHeight() / 2));
// 如果点击的点在圆饼内部,计算点击的角度
if (distance <= getWidth() / 2) {
float clickAngle = (float) (Math.atan2(y - getHeight() / 2, x - getWidth() / 2) * 180 / Math.PI);
clickAngle = (clickAngle + 360) % 360;
// 判断点击的角度落在哪个扇形区域
float startAngle = 0;
for (int i = 0; i < data.length; i++) {
float sweepAngle = 360 * (data[i] / 100);
if (clickAngle >= startAngle && clickAngle <= startAngle + sweepAngle) {
selectedIndex = i;
break;
}
startAngle += sweepAngle;
}
// 重绘视图
invalidate();
}
break;
}
return super.onTouchEvent(event);
}
}
在布局文件中使用该自定义 View:
<com.example.PieChartView
android:layout_width="match_parent"
android:layout_height="300dp" />
通过设置 colors 数组和 data 数组,可以自定义不同扇形区域的颜色和数据比例。点击扇形区域时,会根据点击位置计算出点击的扇形区域索引,并通过重绘视图来实现选中效果
原文地址: https://www.cveoy.top/t/topic/h3wZ 著作权归作者所有。请勿转载和采集!