Нарисуйте текст на круговой траектории в Android

Мне нужно нарисовать текст по окружности. Я попробовал метод drawTextOnPath(). Но для текстов типа "плодородное окно" на прикрепленном изображении текст вращается и не читается.

Это то, что мне нужно

Текст Fertile window не читается

Код, который я использовал:

customPath2.addArc(mCircleRectF, 30F, 64.28F);
    customPaint2.setAntiAlias(true);
    customPaint2.setDither(true);
    customPaint2.setStrokeWidth(mCircleStrokeWidth);
    customPaint2.setColor(Color.parseColor("#93BE66"));
    customPaint2.setStyle(Paint.Style.STROKE);
    customPaint2.setStrokeCap(Paint.Cap.ROUND);
    canvas.drawPath(customPath2, customPaint2);

    titlePaint.setColor(Color.parseColor("#ffffff"));
    titlePaint.setAntiAlias(true);
    titlePaint.setTypeface(Typeface.MONOSPACE);  titlePaint.setLetterSpacing(0.07F);
    titlePaint.setTextAlign(Paint.Align.CENTER);
    titlePaint.setTextSize(35f);

    canvas.drawTextOnPath("FERTILE WINDOW", customPath2, 0, 8, titlePaint);

person Sahana Prabhakar    schedule 29.07.2016    source источник
comment
Итак, начиная сверху, вы хотите, чтобы первые 90 градусов были текстом вниз, затем следующие 180 градусов вверх, а затем снова вверх? Использование только XML? Вы делаете какой-то код? Немного непонятно, что вы хотите. Показанное поведение является ожидаемым. Тем более, что вы можете вращать вид и сохранять весь текст читаемым с одной и той же точки зрения.   -  person Bonatti    schedule 29.07.2016
comment
это может вам помочь   -  person Ravi    schedule 29.07.2016
comment
@Bonatti - я использовал onDraw(), а не XML. Я создал и нарисовал пути.   -  person Sahana Prabhakar    schedule 29.07.2016
comment
@RRR - Да, я ссылался на эту ссылку. Он говорит drawTextOnPath(), но не говорит, как повернуть. Как и в этом примере, текст находится в верхнем левом углу круга, он читаем. Но в моем примере я хочу, чтобы он был внизу кольца.   -  person Sahana Prabhakar    schedule 29.07.2016
comment
См. этот вопрос. У него тоже есть дуга, и его текст отображается правильно.   -  person Vucko    schedule 29.07.2016


Ответы (1)


Благодаря комментариям, чтобы нарисовать текст наружу, сделайте дугу против часовой стрелки.
В вашем примере startAngle становится 94.28, а sweepAngle становится -64.28.

Котлин:

val enclosingRect = RectF(0f, 0f, 200f, 200f)
val path = Path()
path.addArc(enclosingRect, 94.28f, -64.28f)
canvas.drawTextOnPath("FERTILE WINDOW", path, 0f, 0f, myPaint)

Джава:

RectF enclosingRect = new RectF(0f, 0f, 200f, 200f);
Path path = new Path();
path.addArc(enclosingRect, 94.28f, -64.28f);
canvas.drawTextOnPath("FERTILE WINDOW", path, 0f, 0f, myPaint);

Это было для текстов в нижней части круга (от 0 до 180 или от -180 до -360 градусов).

Для углов между 180 и 360 или 0 и -180 градусами вы хотите нарисовать дуги по часовой стрелке.

person Mahozad    schedule 23.05.2021