使用Canvas.drawText()定位文本

4

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

所有问题都出现在Canvas.drawText中。我找不到一个好的公式来计算正确的X和Y。绘制文本后始终处于错误的位置。Y位置始终取决于字体,并且X也会产生小缩进。

这里是屏幕截图(第一个是TextView,下面是绘制的文本):

屏幕截图

这是我用于查找位置的代码:

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个回答

9
canvas.drawText()方法的X和Y参数指定了一个原点。文字的绘制方式中,该原点的Y值在文本的基线上(字母所在的线),而原点的X值则取决于Paint对象中当前的Align设置,可以是最左、最右或者正中间。
当你调用getX()getY()时,你得到的是TextView左上角的当前像素坐标,而不是TextView正在绘制的文本的原点。根据当前的Align设置,X值是正确的,但是Y值不匹配。
如果你想与TextView中的文本匹配,请尝试将getY()返回的值加上textView.getBaseline()
此外,考虑使用其中一种文本布局类(例如StaticLayoutDynamicLayout)来绘制文本。在这种情况下,它将使用画布原点作为绘制文本的左上角,因此您无需计算基线。

哇,感谢您解释了在drawtext中使用的坐标系! - Ameer ali khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接