Java 如何在画布中的圆圈周围创建可用的填充空间(Android)

Java 如何在画布中的圆圈周围创建可用的填充空间(Android),java,android,android-canvas,Java,Android,Android Canvas,我在圆的外环上显示点时遇到问题。当一个点被放置在圆的一条边上时,该点被半切。截图: 我只是想让圆的半径小一点,这样周围就有一些空间,外部的点也有一些空间。当然圈子仍然必须停留在视野的中间。非常感谢关于如何做到这一点的提示 工作代码blow是完全工作的,接受点被切掉的事实。(感谢@Sherif elKhatib在创建双色圆圈方面提供的帮助) public class PercentView扩展了视图{ public PercentView(Context context) { super(

我在圆的外环上显示点时遇到问题。当一个点被放置在圆的一条边上时,该点被半切。截图:

我只是想让圆的半径小一点,这样周围就有一些空间,外部的点也有一些空间。当然圈子仍然必须停留在视野的中间。非常感谢关于如何做到这一点的提示

工作代码blow是完全工作的,接受点被切掉的事实。(感谢@Sherif elKhatib在创建双色圆圈方面提供的帮助)

public class PercentView扩展了视图{

public PercentView(Context context) {
    super(context);
    init();
}

public PercentView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public PercentView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

private void init() {
    paint = new Paint();
    paint.setColor(Color.parseColor("#3498db"));
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL);
    bgpaint = new Paint();
    bgpaint.setColor(Color.parseColor("#2980b9"));
    bgpaint.setAntiAlias(true);
    bgpaint.setStyle(Paint.Style.FILL);
    rect = new RectF();
    circlePaint = new Paint();
}

Paint paint;
Paint bgpaint;
RectF rect;
float percentage = 5;
Paint circlePaint;
float[] dots = new float[1000];
int dotsNum = -1;
String[] colorCode = new String[1000];

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // draw background circle anyway
    canvas.drawArc(rect, -90, 360, true, bgpaint);
    if (percentage != 0) {
        int left = 0;
        int width = getWidth();
        int top = 0;
        rect.set(left, top, left + width, top + width);
        canvas.drawArc(rect, -90, (float) (3.6 * percentage), true, paint);

        for (int i = 0; i <= dotsNum; i++) {
            circlePaint.setAntiAlias(true);
            circlePaint.setColor(Color.parseColor(colorCode[i]));
            circlePaint.setStyle(Paint.Style.FILL);
            float dotX = (float) (this.getWidth() / 2 + this.getWidth() / 2
                    * Math.cos((dots[i] * 3.6 - 90) * Math.PI / 180));
            float dotY = (float) (this.getHeight() / 2 + this.getWidth()
                    / 2 * Math.sin((dots[i] * 3.6 - 90) * Math.PI / 180));
            canvas.drawCircle(dotX, dotY, 30, circlePaint);
        }
    }
}

public void setPercentage(float inpercentage) {
    this.percentage = inpercentage;
    invalidate();
}

public void setDot(int type) {
    dotsNum++;

    switch (type) {
    case 0: 
        colorCode[dotsNum] = "#27ae60";
        break;
    case 1: 
        colorCode[dotsNum] = "#f1c40f";
        break;
    case 2: 
        colorCode[dotsNum] = "#e74c3c";
        break;
    case 3: 
        colorCode[dotsNum] = "#34495e";
        break;
    }

    dots[dotsNum] = percentage;
    invalidate();
}
公共百分比视图(上下文){
超级(上下文);
init();
}
公共百分比视图(上下文、属性集属性){
超级(上下文,attrs);
init();
}
公共百分比视图(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
init();
}
私有void init(){
油漆=新油漆();
paint.setColor(Color.parseColor(#3498db));
paint.setAntiAlias(真);
绘制.设置样式(绘制.样式.填充);
bgpaint=新油漆();
bgpaint.setColor(Color.parseColor(#2980b9”);
bgpaint.setAntiAlias(真);
bgpaint.setStyle(Paint.Style.FILL);
rect=新的RectF();
circlePaint=新油漆();
}
油漆;
油漆;
rectfrect;
浮动百分比=5;
油漆;
浮动[]点=新浮动[1000];
int dotsNum=-1;
字符串[]颜色代码=新字符串[1000];
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
//还是画背景圈吧
画布.drawArc(rect,-90,360,true,bgpaint);
如果(百分比!=0){
int左=0;
int width=getWidth();
int-top=0;
矩形集(左、上、左+宽、上+宽);
画布。绘制弧(矩形,-90,(浮动)(3.6*百分比),真实,绘制);

对于(int i=0;i我唯一的工作方法就是那段代码“width=getWidth()-padding”.Kudos@Catherine.

从我头顶上掉下来,还没有试过,你有没有试过设置
width=getWidth()-padding;
?谢谢@Catherine。真的很管用。我可以发誓我已经试过了。