/**
* @author: 魏
* @date: 2021/11/9
* 饼图-每个扇形图可点击
*/
public class RadiusView extends View {
private Paint paint;
private float centerCircleX;
private float centerCircleY;
private Region mRegion1=new Region();
private Region mRegion2=new Region();
private Region mRegion3=new Region();
private Region mRegion4=new Region();
private float startAngle1 = 0;//起始角度
private float startAngle2 = 0;//起始角度
private float startAngle3 = 0;//起始角度
private float startAngle4 = 0;//起始角度
private float sweepAngle1=30;//扫描角度
private float sweepAngle2=120;//扫描角度
private float sweepAngle3=150;//扫描角度
private float sweepAngle4=60;//扫描角度
private boolean down1=true;
private boolean down2=false;
private boolean down3=false;
private boolean down4=false;
private OnRadiusClickListener onRadiusClickListener;
private int i=0;
public RadiusView(Context context) {
super(context);
initPaint();
}
public RadiusView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initPaint();
}
public RadiusView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
}
//初始化画笔
private void initPaint() {
paint = new Paint();
//设置画笔模式:填充
paint.setStyle(Paint.Style.FILL);
paint.setTextSize(30);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(getWidth() / 2, getHeight() / 2); //将画布坐标原点移到中心位置
float r = (float) (Math.min(getWidth(), getHeight()) / 2);//饼状图半径(取宽高里最小的值)
float r2 = (float) (Math.min(getWidth()-(getWidth()/7), getHeight()-(getHeight()/7)) / 2);
float r3 = (float) (Math.min(getWidth()-2*(getWidth()/7), getHeight()-2*(getHeight()/7)) / 2);
float r4 = (float) (Math.min(getWidth()-3*(getWidth()/7), getHeight()-3*(getHeight()/7)) / 2);
final Path ovalPath1 = new Path();
final Path ovalPath2 = new Path();
final Path ovalPath3 = new Path();
final Path ovalPath4 = new Path();
//初始化区域
RectF rectF = new RectF();
RectF rectF1 = new RectF();
RectF rectF2 = new RectF();
RectF rectF3 = new RectF();
RectF rectF4 = new RectF();
if (down1){
rectF1.set(-r, -r, r, r);
}else {
rectF1.set(-r2, -r2, r2, r2);
}
if (down2){
rectF2.set(-r, -r, r, r);
}else {
rectF2.set(-r2, -r2, r2, r2);
}
if (down3){
rectF3.set(-r, -r, r, r);
}else {
rectF3.set(-r2, -r2, r2, r2);
}
if (down4){
rectF4.set(-r, -r, r, r);
}else {
rectF4.set(-r2, -r2, r2, r2);
}
rectF.set(-r, -r, r, r);
paint.setColor(getResources().getColor(R.color.color_122));
canvas.drawArc(rectF, 0,360, true, paint);
//ovalPath.moveTo(0, 0);
//ovalPath.lineTo(r, r);
//ovalPath.close();
//ovalPath.computeBounds(rectF, false);
paint.setColor(getResources().getColor(R.color.color_111));
ovalPath1.addArc(rectF1, startAngle1,sweepAngle1);
ovalPath1.lineTo(0, 0);
mRegion1.setPath(ovalPath1, new Region((int)rectF1.left, (int) rectF1.top, (int) rectF1.right,(int)rectF1.bottom));
canvas.drawPath(ovalPath1,paint);
startAngle2=startAngle1+sweepAngle1;
paint.setColor(getResources().getColor(R.color.color_108));
ovalPath2.addArc(rectF2, startAngle2,sweepAngle2);
ovalPath2.lineTo(0, 0);
mRegion2.setPath(ovalPath2, new Region((int)rectF2.left, (int) rectF2.top, (int) rectF2.right,(int)rectF2.bottom));
canvas.drawPath(ovalPath2,paint);
startAngle3=startAngle2+sweepAngle2;
paint.setColor(getResources().getColor(R.color.color_109));
ovalPath3.addArc(rectF3, startAngle3,sweepAngle3);
ovalPath3.lineTo(0, 0);
mRegion3.setPath(ovalPath3, new Region((int)rectF3.left, (int) rectF3.top, (int) rectF3.right,(int)rectF3.bottom));
canvas.drawPath(ovalPath3,paint);
startAngle4=startAngle3+sweepAngle3;
paint.setColor(getResources().getColor(R.color.color_110));
ovalPath4.addArc(rectF4, startAngle4,sweepAngle4);
ovalPath4.lineTo(0, 0);
mRegion4.setPath(ovalPath4, new Region((int)rectF4.left, (int) rectF4.top, (int) rectF4.right,(int)rectF4.bottom));
canvas.drawPath(ovalPath4,paint);
rectF.set(-r3, -r3, r3, r3);
paint.setColor(getResources().getColor(R.color.color_all));
canvas.drawArc(rectF, 0,360, true, paint);
rectF.set(-r4, -r4, r4, r4);
paint.setColor(getResources().getColor(R.color.white));
canvas.drawArc(rectF, 0,360, true, paint);
centerCircleX = (getWidth() + getPaddingLeft() - getPaddingRight()) / 2;
centerCircleY = (getHeight() + getPaddingTop() - getPaddingBottom()) / 2;
}
public boolean onTouchEvent(MotionEvent event) {
float x;
float y;
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
x = event.getX()-centerCircleX;
y = event.getY()-centerCircleY;
boolean b1 = mRegion1.contains((int) x, (int) y);
boolean b2 = mRegion2.contains((int) x, (int) y);
boolean b3 = mRegion3.contains((int) x, (int) y);
boolean b4 = mRegion4.contains((int) x, (int) y);
if (b1){
Log.d("onTouchEvent", "onTouchEvent: b1: "+b1);
down1 = true;
down2 = false;
down3 = false;
down4 = false;
i=1;
}
if (b2){
Log.d("onTouchEvent", "onTouchEvent: b2: "+b2);
down1 = false;
down2 = true;
down3 = false;
down4 = false;
i=2;
}
if (b3){
Log.d("onTouchEvent", "onTouchEvent: b3: "+b3);
down1 = false;
down2 = false;
down3 = true;
down4 = false;
i=3;
}
if (b4){
Log.d("onTouchEvent", "onTouchEvent: b4: "+b4);
down1 = false;
down2 = false;
down3 = false;
down4 = true;
i=4;
}
if (onRadiusClickListener!=null){
onRadiusClickListener.OnRadiusClickListener(i);
}
break;
}
//更新绘制
invalidate();
return true;
}
public void setSweepAngle(float sweepAngle1,float sweepAngle2,float sweepAngle3,float sweepAngle4){
this.sweepAngle1 = sweepAngle1;
this.sweepAngle2 = sweepAngle2;
this.sweepAngle3 = sweepAngle3;
this.sweepAngle4 = sweepAngle4;
}
public void setOnRadiusClickListener(OnRadiusClickListener onRadiusClickListener){
this.onRadiusClickListener = onRadiusClickListener;
}
public interface OnRadiusClickListener{
void OnRadiusClickListener(int i);
}
}
不喜勿喷,仅供大家参考!