Нарисуйте текст для описания оси графика - PullRequest
0 голосов
/ 02 ноября 2018

Я рисую график, используя SkiaSharp. Теперь я хочу добавить описание оси (понедельник, вторник, ...) по оси X.

Важный код здесь:

foreach(string key in surveyAnswers.Keys)
            {
                SKPath currentTextPath = new SKPath();
                currentTextPath.MoveTo((float)(info.Width * borderOffset + i * xStepSize - 70), (float)(info.Height * borderOffset + (answerPossibilitiesCount - 1) * yStepSize + 70));
                currentTextPath.RLineTo(70, -70);

                canvas.DrawTextOnPath(key, currentTextPath, 0, 0, paint);
                i++;
            }

Он предоставляет мне правильно расположенный путь, по которому я рисую текст. Проблема в том, что путь имеет фиксированную длину. Я делаю его 70 высотой и шириной, что оставляет место для коротких текстов и сокращает более длинные.

Пример можно найти здесь .

Я подумал о нескольких способах решения проблемы, хотя ни один из них не работает, поскольку они требуют неподдерживаемых операций или информации, которой у меня нет.

Как выровнять текст по графику?

1 Ответ

0 голосов
/ 02 ноября 2018

Я решил это с помощью переменной pathLength, которая зависит от размера шрифта и длины текста.

float pathLenght = (float)((key.Length * (17.0f/25.0f * textSize)) / Math.Sqrt(2));

Соотношение 17/25, кажется, прекрасно работает на многих размерах шрифта.

Просто если кому-то это понадобится, я выкладываю код выше со вставленным решением

foreach(string key in surveyAnswers.Keys)
            {
                float pathLenght = (float)((key.Length * (17.0f/25.0f * textSize)) / Math.Sqrt(2));
                SKPath currentTextPath = new SKPath();
                currentTextPath.MoveTo((float)(info.Width * borderOffset + i * xStepSize - pathLenght), (float)(info.Height * borderOffset + (answerPossibilitiesCount - 1) * yStepSize + pathLenght));
                currentTextPath.RLineTo(pathLenght, -pathLenght);

                canvas.DrawTextOnPath(key, currentTextPath, 0, 0, paint);
                i++;
            }
...