在固定位置的位图上绘制文本

时间:2019-07-19 23:30:10

标签: java android canvas android-bitmap drawtext

我正在尝试使用下面的代码在位图上绘制两个文本,一切正常,但是如果文本的大小变小,则位图的大小会出现问题,例如

1080x1920

enter image description here

250x268

enter image description here

代码:

public Bitmap drawTextToBitmapVHS(Context gContext,
                                      Bitmap bitmap) {
        String PLAY = "PLAY ►";
        String DATE = getDate(Calendar.getInstance());
        android.graphics.Bitmap.Config bitmapConfig =
                bitmap.getConfig();
        if (bitmapConfig == null) {
            bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
        }
        bitmap = bitmap.copy(bitmapConfig, true);
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);
        double relation = Math.sqrt(canvas.getWidth() * canvas.getHeight()) / 250;
        paint.setTextSize((float) (12 * relation));
        paint.setTypeface(Typeface.create(Typeface.createFromAsset(getAssets(), "fonts/VCR.ttf"), Typeface.BOLD));
        Rect bounds = new Rect();
        paint.getTextBounds(DATE, 0, DATE.length(), bounds);
        int horizontalSpacing = 24;
        int verticalSpacing = 36;
        int x = horizontalSpacing;
        int y = bitmap.getHeight() - verticalSpacing;
        canvas.drawText(PLAY,
                x, bounds.height() + verticalSpacing, paint);
        canvas.drawText(getHours(Calendar.getInstance()), x, y - 50, paint);
        canvas.drawText(DATE, x, y, paint);
        return bitmap;
    }

尽管位图的大小与第一个图像(1080x1920)完全一样,但是我如何使文本固定,谢谢。

1 个答案:

答案 0 :(得分:0)

问题似乎出在您的硬编码间距以及可能是您计算的文字大小。如果您将这些设置与位图大小相关,则可能会有所帮助,例如:

int horizontalSpacing = 24 * bitmap.getWidth() / 1080;
int verticalSpacing = 36 * bitmap.getHeight() / 1920;

这应该将位置设置为与1080x1920位图相同,但是对于小的位图,除非类似地调整相对于位图高度的文本大小,否则您可能会发现文本重叠:

paint.setTextSize((float) (70 * bitmap.getHeight() / 1920));

您对时间字段的定位也经过硬编码,因此需要更改:

int hoursOffset = 50 * bitmap.getHeight() / 1920;
canvas.drawText(getHours(Calendar.getInstance()), x, y - hoursOffset, paint);

将这些文字放在一起,将在与1080x1920位图相同的相对位置和大小上绘制文本。