【问题标题】:Android drawText missing characters on Lollipop棒棒糖上的Android drawText缺少字符
【发布时间】:2014-11-28 21:22:48
【问题描述】:

我有一个显示比例的 android 应用程序,它在所有版本上都可以正常工作,直到 5.0 (Lollipop),其中使用 drawText 方法绘制的所有文本都以某种方式被截断。 仅显示两个字母文本的第二个字母。
即第一个标记只是'0'字母但不显示。
对于第二个 2 标记(40 和 80),仅显示 0,其余 140...250,不显示文本。
文本大小似乎还可以,但并未显示所有字符。 图像按 [0..1, 0..1] 正方形缩放。
我在 drawText 上找到并尝试了很多帖子,但没有一个有帮助。
(View.setLayerType()所有组合,setLinearText(true),Paint.Style.FILL...)

private void drawScale(final Canvas canvas) {
    canvas.save(Canvas.MATRIX_SAVE_FLAG);
    // On canvas, North is 0 degrees, East is 90 degrees, South is 180 etc.
    // We start the scale somewhere South-West so we need to first rotate the canvas.
    canvas.rotate(mScaleRotation, 0.5f, 0.5f);

    final int totalTicks = mDivisions * mSubdivisions + 1;
    for (int i = 0; i < totalTicks; i++) {
        final float y1 = mScaleRect.top;
        final float y2 = y1 + 0.015f; // height of division
        final float y3 = y1 + 0.045f; // height of subdivision

        final float value = getValueForTick(i);
        final Paint paint = getRangePaint(value);
        if (0 == value % mDivisions) {
            // Draw a division tick
            canvas.drawLine(0.5f, y1, 0.5f, y3, paint);
            // Draw the text 0.15 away from the division tick
            canvas.drawText(valueString(value), 0.5f, y3 + 0.045f, paint);
        }
        else {
            // Draw a subdivision tick
            canvas.drawLine(0.5f, y1, 0.5f, y2, paint);
        }
        canvas.rotate(mSubdivisionAngle, 0.5f, 0.5f);
    }
    canvas.restore();
}

像这样创建范围绘制的地方

mRangePaints[i] = new Paint(Paint.LINEAR_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
mRangePaints[i].setColor(mRangeColors[i]);
mRangePaints[i].setStyle(Paint.Style.STROKE);
mRangePaints[i].setStrokeWidth(0.005f);
mRangePaints[i].setTextSize(0.05f);
mRangePaints[i].setTypeface(Typeface.SANS_SERIF);
mRangePaints[i].setTextAlign(Align.CENTER);
mRangePaints[i].setShadowLayer(0.005f, 0.002f, 0.002f, mTextShadowColor);

画布是这样创建的

mBackground = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(mBackground);

这是来自 android 5.0 的捕获

Android 5.0

这是从 android 4.4 捕获的

Android <5.0

任何帮助、线索等......将不胜感激。

编辑: 谢谢你的建议,

我编写了一个函数,可以像 textSize 10f 一样重新缩放所有尺寸。 对 canvas.drawText 的每个原始调用都被替换为对此的调用

drawScaledText(canvas, ... 原始值 ...)

一切似乎都很好。

这里是sn-p的代码:

public static void drawScaledText(Canvas canvas, String text, float x, float y, Paint paint, float scale) {
    float originalStrokeWidth = paint.getStrokeWidth();
    float originalTextSize = paint.getTextSize();
    float textScaling = 10f/originalTextSize;
    paint.setStrokeWidth(originalStrokeWidth * textScaling);
    paint.setTextSize(originalTextSize * textScaling);
    canvas.save();
    canvas.scale(scale/textScaling, scale/textScaling);
    canvas.drawText(text, x * textScaling, y * textScaling, paint);
    canvas.restore();
    paint.setStrokeWidth(originalStrokeWidth);
    paint.setTextSize(originalTextSize);
}

【问题讨论】:

  • 你的比例参数是什么?我使用每一个数字,但没有一个有效:(我使用这个库并且有这个问题
  • @AmirHosseinGhasemi 你有想过这个吗?我也在使用这个库,似乎找不到如何解决这个问题的好答案。 OP 的解决方案似乎也不适合我。
  • 是的,它对我有用,但只适用于大于 1f 的 textSize。正如 Kuffs 所说,如果 size 小于 1f,drawText 函数就不能正常工作。我所有的绘图都是在一个 1f x 1f 的矩形中完成的,这样图像就可以很容易地缩放到任何尺寸。这就是我的文本大小最初为 0.05f 的原因。我写的函数,绘制一个更大尺寸的文本,然后重新调整整个画布以匹配整个图像。
  • @Luci 我有相同的“配置”,一个 1f x 1f 的矩形和一个 0.05f 的想要的 textSize。但是我想不出与您的函数一起使用的好参数来在我想要的地方绘制我的文本。我希望我的文本在 x = 0.5f, y = 0.8f 处绘制,大小为 0.05f。我应该为 Paint.textSize 和 scale 参数使用什么值?
  • @Magnas 这是我的默认文本绘制设置 getDefaultTextValuePaint() { final Paint paint = new Paint(Paint.LINEAR_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);油漆.setColor(mTextValueColor); paint.setStyle(Paint.Style.FILL_AND_STROKE);油漆.setStrokeWidth(0.005f); paint.setTextSize(mTextValueSize); paint.setTextAlign(Align.CENTER); paint.setTypeface(Typeface.SANS_SERIF); paint.setShadowLayer(0.01f, 0.002f, 0.002f, mTextShadowColor);回漆; } 其中 TextValueSize 为 0.3f

标签: android android-5.0-lollipop drawtext


【解决方案1】:

canvas.DrawText()canvas.DrawTextOnPath() 在小于 1 的尺寸下效果不佳

增加字体大小。您可以缩放画布以进行补偿。

查看此问题的答案。 Android 4.2.1 wrong character kerning (spacing)

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 2015-06-12
    • 2016-02-28
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多