Android: ищем метод drawArc () с внутренним и внешним радиусом - PullRequest
33 голосов
/ 06 октября 2010

У меня есть следующий пользовательский вид:

alt text

Этого я достиг, используя метод Canvas 'drawArc(). Однако с помощью этого метода drawArc() я не могу ограничить внутренний радиус дуги.

Я бы хотел получить что-то вроде этого:

alt text

там, где осталось только внешнее кольцо.

Мне нужна функция drawArc(), в которой я могу установить внутренний радиус дуги. Кто-нибудь знает, как это сделать?

(Кстати, перекраска внутренней области не работает, потому что она должна быть прозрачной. Окрашивание внутреннего круга с помощью Color.TRANSPARENT после окрашивания красных и синих конусов не удаляет старый цвет. Он просто накладывает другой слой сверху, который прозрачный и сквозь который я все еще вижу красный и синий)

Ответы [ 5 ]

71 голосов
/ 01 апреля 2011

Вы можете сделать это:

    Paint paint = new Paint();
    final RectF rect = new RectF();
    //Example values
    rect.set(mWidth/2- mRadius, mHeight/2 - mRadius, mWidth/2 + mRadius, mHeight/2 + mRadius); 
    paint.setColor(Color.GREEN);
    paint.setStrokeWidth(20);
    paint.setAntiAlias(true);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStyle(Paint.Style.STROKE);
    canvas.drawArc(rect, -90, 360, false, paint);

Клавиша находится в paint.setStyle(Paint.Style.STROKE);, она обрезает центр дуги с помощью обводки, которую вы определили в setStrokeWidth (в примере рисуется дуга с радиусом mRadius и толщиной 20 пикселей).

Надеюсь, это поможет!

30 голосов
/ 06 октября 2010

Вы можете закрасить внутреннюю область, используя xfermode PorterDuff под названием «Очистить».Это сотрет пиксели.

16 голосов
/ 10 августа 2014
private static final float CIRCLE_LIMIT = 359.9999f;
/**
 * Draws a thick arc between the defined angles, see {@link Canvas#drawArc} for more.
 * This method is equivalent to
 * <pre><code>
 * float rMid = (rInn + rOut) / 2;
 * paint.setStyle(Style.STROKE); // there's nothing to fill
 * paint.setStrokeWidth(rOut - rInn); // thickness
 * canvas.drawArc(new RectF(cx - rMid, cy - rMid, cx + rMid, cy + rMid), startAngle, sweepAngle, false, paint);
 * 
* но поддерживает разные краски заливки и обводки. * * @param canvas * @param cx горизонтальная средняя точка овала * @param cy вертикальная средняя точка овала * @param rInn внутренний радиус сегмента дуги * @param rOut внешний радиус сегмента дуги * @param startAngle see {@link Canvas # drawArc} * @param sweepAngle see {@link Canvas # drawArc}, ограничено до & plusmn; 360 * @param заполнить заливкой краской, можно null * инсульт @parm, краска может быть null * @see Canvas # drawArc * / public static void drawArcSegment (Canvas canvas, float cx, float cy, float rInn, float rOut, float startAngle, float sweepAngle, заливка краской, мазок краски) { if (sweepAngle> CIRCLE_LIMIT) { sweepAngle = CIRCLE_LIMIT; } if (sweepAngle

Может быть расширен до овальной дуги путем дублирования rInn и rOut для направлений x и y.

Также не было частью вопроса, но нарисовать текст в середине сегмента:

textPaint.setTextAlign(Align.CENTER);
Path midway = new Path();
float r = (rIn + rOut) / 2;
RectF segment = new RectF(cx - r, cy - r, cx + r, cy + r);
midway.addArc(segment, startAngle, sweepAngle);
canvas.drawTextOnPath("label", midway, 0, 0, textPaint);
2 голосов
/ 25 февраля 2019

рисование круга и дуги.следующий код немного грязный, но может помочь

        int sweepAngle sweepAngle = (360/7)%360;
    int startAngle = -90;
    int x = getWidth()/2;
    int y = getHeight()/2;
    int radius;
    radius = getWidth()/2-50;
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(50);
    paint.setColor(Color.WHITE);

    paint.setColor(Color.parseColor("#CD5C5C"));
    mBarPaintFill.setAntiAlias(true);

    canvas.drawCircle(x , y , radius, paint);
    paint.setColor(Color.BLUE);
    for (int i = 1 ; i<=5 ; i++){

        canvas.drawArc(x-radius,y-radius,x+radius,y+radius,startAngle,sweepAngle,false,paint);
        startAngle = (startAngle + sweepAngle+20)%360;
    }

enter image description here

2 голосов
/ 07 апреля 2015

Вы можете попробовать следующие ShapeDrawable

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
    <shape android:shape="oval" >
        <size
            android:height="56dp"
            android:width="56dp" />

        <stroke
            android:width="10dp"
            android:color="#0000ff" />
    </shape>
</item>
<item>
    <shape android:shape="oval" >
        <size
            android:height="24dp"
            android:width="25dp" />

        <stroke
            android:dashGap="10dp"
            android:dashWidth="10dp"
            android:width="10dp"
            android:color="#FF0000" />
    </shape>
</item>

...