有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何改变Android画布的输出。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轴)。我想按时钟顺序从顶部显示文本。我想更改文本的起始位置。我对安卓Canvas.translate()Canvas.scale()感到困惑。或者我应该使用Canvas.rotate()?为了清楚地理解我的问题,我粘贴了下面的输出enter image description here

我想以这种形式显示输出

enter image description here


共 (2) 个答案

  1. # 1 楼答案

    可以使用圆弧代替圆:

    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);

    使用矩阵可以平移、旋转和缩放路径。 例如,上面的代码将从第一个象限开始绘制文本,即从(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);
    
  2. # 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)成功了