Как изменить вывод Android Canvas.drawTextOnPath()

Я новичок в Android, и я написал следующий пример кода.

public class Circle extends View {
 Paint paint = new Paint();
 Path path = new Path();
 private static final String s = "Hello world example";

 public Circle(Context context) {
 super(context);
 paint.setColor(Color.BLACK);
 paint.setStyle(Style.STROKE);
 paint.setStrokeWidth(2);
 paint.setAntiAlias(true);
 paint.setTextSize(30);
 }

 public void onDraw(Canvas c) { 
 path.addCircle(getWidth()/2, getHeight()/2, 180, Direction.CW);
 c.drawTextOnPath(s, path, 0, 10, paint);
 setLayerType(View.LAYER_TYPE_SOFTWARE, null);
 } 

 }

Canvas.drawTextOnPath() отображает текст, начинающийся с правой стороны (я имею в виду положительную ось X). Я хочу отображать текст сверху с часами. Я хочу изменить начальную позицию текста. Я запутался в Android Canvas.translate() и Canvas.scale(). Или я должен использовать Canvas.rotate()? Я вставлял результат ниже для ясного понимания моего вопроса.

Я хочу отобразить вывод в этой форме.

2 ответа

Я, наконец, исправил проблему с Canvas, добавив Canvas.rotate(float degrees, float px, float py) в свой код перед применением и методы Canvas. Ниже приведен код.

public class Circle extends View {
 Paint paint = new Paint();
 Path path = new Path();
 private static final String s = "Hello world example";

 public Circle(Context context) {
 super(context);
 paint.setColor(Color.BLACK);
 paint.setStyle(Style.STROKE);
 paint.setStrokeWidth(2);
 paint.setAntiAlias(true);
 paint.setTextSize(30);
 }

 public void onDraw(Canvas c) { 
 c.rotate(-90, getWidth()/2, getHeight()/2);
 path.addCircle(getWidth()/2, getHeight()/2, 180, Direction.CW);
 c.drawTextOnPath(s, path, 0, 10, paint);
 setLayerType(View.LAYER_TYPE_SOFTWARE, null);
 } 
}

Я пробовал Canvas.rotate(float degrees) раньше, но не работал. Тем не менее, Canvas.rotate(float degrees, float px, float py) работает!


Вместо круга можно использовать дугу:

Path path = new Path(); RectF rect = new RectF(width/2 - radius, height/2 - radius, width/2 + radius, height/2 + radius); path.addArc(rect 270, 270); canvas.drawTextOnPath(msg., path, 0, 0, paint);

Путь может быть переведен, повернут и масштабирован с помощью Matrix. Например, приведенный выше код будет рисовать текст, начиная с первого квадранта, т.е. От (y, 0). Чтобы начать рисование с (-y, 0) по часовой стрелке,

Path path = new Path();
 RectF rect = new RectF(width/2 - radius, height/2 - radius, width/2 + radius, height/2 + radius);
 Matrix matrix = new Matrix();
 matrix.setScale(-1, -1, width/2, height/2);
 path.addArc(rect, 270, 270);
 path.transform(matrix);
 canvas.drawTextOnPath(msg, path, 0, 0, paint);

licensed under cc by-sa 3.0 with attribution.