【问题标题】:How to Render text to bitmap and draw it如何将文本渲染到位图并绘制它
【发布时间】:2012-12-01 00:04:46
【问题描述】:

我是 android 新手,我的团队目前正在使用 opengl es 2.0 创建一个使用 GlSurfaceView 的图形应用程序。

我们最近在绘图上显示了网格和刻度线,现在我被分配了实现数字刻度并将 x 和 y 轴标记为“X”和“Y”的任务。

经过大量研究后,我决定通过将一串字符渲染到位图来实现这一点。我在实现这一目标时遇到了很多问题。我了解基本概念。我知道我需要字母数字字符“0123456789”和“XY”和“-”(用于 -x 和 -y 刻度)。我已经看到了许多不同的例子,并广泛尝试遵循 JVitella 的例子here

我开始掌握这个概念,但就我的字符串而言,我知道我有 13 个字符,那么我的位图应该有多大?

同样在 Jvitelas 示例中,我对代码感到目瞪口呆:

Drawable background = context.getResources().getDrawable(R.drawable.background);

我不明白到底发生了什么,当我编写此代码时,我收到上下文语法错误。

对于我的应用程序,我知道我需要将字符串保存到一个位图中,就像这样。我会创建一个位图,但它应该有多大?然后我从位图和 canvas.drawText 创建一个画布到位图中。

  [ 0 1 2 3 4 ]
  | 5 6 7 8 9 |
  [ X Y Z     ]

基本上我在问:

  • 上面的位图如何实现?
  • 如何从位图中绘制个位数?
  • 如何绘制多于一位的数字?

【问题讨论】:

    标签: java android opengl-es drawtext text-rendering


    【解决方案1】:

    你问了很多问题,但我会试着回答几个:

    • 那么我的位图应该有多大?

      这完全取决于您,具体取决于您希望文本的清晰程度。您可以为每个可以很好缩放的字符分配一个具有数百像素的巨大位图,或者分配一个分辨率有限的非常小的位图。我会说你想要的任何“字体大小”,为每个字符分配至少那么多像素的高度。因此,如果您想绘制字体大小为“20”的东西,那么您可能需要一个 5x20 x 3x20 或 100x60 的位图。

    • 我如何从位图中绘制个位数?

      您将使用 opengl 在要绘制字母的位置绘制一个四边形,然后使用该四边形的纹理坐标来选择一个字母。

      例如,如果我想画一个 X,那么你在屏幕上画一个四边形,并将它的 texcoords 从 (0,0) 分配到 (0.2, 0.33),它选择纹理的左侧 1/5,和纹理的底部 1/3。您将看到像这样的框如何与纹理中“X”的位置对齐。

    • 我如何绘制多于一位的数字?

      您只需在彼此旁边画两个独立的个位数。


    如果您在这里的唯一目标是在 Android 中绘制文本,那么使用FrameLayout 并在GLSurfaceView 之上叠加TextViews 可能会更容易。 OpenGL 不是为文本设计的,这使得它有些麻烦。

    【讨论】:

    • 感谢您为回答所有问题所做的努力!我想我现在理解位图的概念了。我对 GLSurfaceView 之上的 TextViews 感兴趣。我记得读过这篇文章,对于这个应用程序,我希望用户能够向左或向右、向上或向下平移。该应用程序已经重新渲染 GLSurfaceView 以从运动事件中更新。这意味着如果我从(-10 到 10)X 域向右平移 5 个缩放单位,新的 GLSurfaceView 将显示 X 域的(-5 到 15)的渲染图。
    • TextView 是否能够有效地更新 GLSurfaceView 之上?我只会绘制整数的标量单位,即(-5 到 5)域我会绘制 = -5 -4 -3 -2 -1 0 1 2 3 4 5。TextView 会比位图实现。再次感谢并为你 +1 提姆
    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2013-09-21
    相关资源
    最近更新 更多