使用Canvas.drawText()

时间:2016-04-20 14:38:52

标签: android

我是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;
}

以下是绘图代码:

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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