【问题标题】:Positioning text using Canvas.drawText()使用 Canvas.drawText() 定位文本
【发布时间】:2016-04-20 14:38:52
【问题描述】:

我是 Android 开发的新手,现在正在尝试制作一个简单的应用程序。用户可以选择图像并向其添加文本。用户可以选择不同的字体和文本大小。对于预览,我在 RelativeLayout 中使用 ImageView,创建的文本将从代码添加到布局中(使用 TextView)。当用户按下保存按钮时,图像将与文本一起保存。

Canvas.drawText 中的所有问题。我找不到计算正确 X 和 Y 的好公式。绘制文本后总是在错误的位置。 Y 位置总是因字体而异,X 也会缩进。

这是截图(首先是TextView,下面是图文):

Screenshot

这是我找到位置的代码:

public float[] getPosition(ImageView imageView, TextView textView) {
    Matrix matrix = new Matrix();
    imageView.getImageMatrix().invert(matrix);
    float[] coord = {textView.getX(), textView.getY()+textView.getHeight()};
    matrix.mapPoints(coord);
    return coord;
}

这里是draw的代码:

float[] coord = bundle.getFloatArray("coord");
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setTypeface(fontsList.get(bundle.getInt("font")));
        paint.setAlpha((int)(255*bundle.getFloat("alpha"))); 
        paint.setTextSize(bundle.getFloat("size")*bundle.getFloat("scale"));
        paint.setColor(bundle.getInt("color"));
        canvas.drawText(text, coord[0],coord[1],paint);

【问题讨论】:

    标签: android


    【解决方案1】:

    canvas.drawText() 的 X 和 Y 参数指定一个原点。文本的绘制方式,原点的 Y 值位于文本的基线(字母所在的行)上,原点的 X 值位于最左侧、最右侧或正中心,具体取决于当前Align 对象上的 Paint 设置。

    当您调用getX()getY() 时,您将获得TextView 左上角的当前像素坐标。这不是TextView 所绘制文本的来源。使用当前的Align 设置,X 值很好;但是,Y 值不匹配。

    如果您想将您的文本与TextView 的文本匹配,请尝试将textView.getBaseline() 添加到getY() 返回的值。

    还值得考虑使用其中一种文本布局类(例如StaticLayoutDynamicLayout)来绘制文本。在这种情况下,它将使用画布原点作为绘制文本的左上角进行绘制,因此您无需计算基线。

    【讨论】:

    • 感谢您解释 drawtext 中使用的坐标系!
    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多