字体大小过大无法适应缓存

23

最近我切换到了Android 3.0(蜂巢),在使用硬件渲染时遇到了一些问题,特别是在我编写的某个自定义视图上,我使用了字体大小为200来显示一些文本。

不幸的是,似乎openGLRenderer并不太喜欢那种相当大的字体大小,因为我在日志中收到了错误信息:

06-06 16:22:00.080: ERROR/OpenGLRenderer(2503): Font size to large to fit in cache. width, height = 97, 145

有没有绕过这个问题的方法(或修复它的方法),以便我可以获得想要的字体大小显示文本?


所以我通过为需要使用该字体大小的所有字符创建图像来解决了这个问题,但我可以想象有时您不想这样做,因此保持开放以获得更明确的答案。 - MrJre
3个回答

33

这实际上是Android操作系统中硬件加速模块内的一个错误。 我认为最好的方法是要求系统在包含大文本尺寸的TextView上避免使用硬件加速。 为此,只需在代码中添加:

TextView bigText = (TextView) findViewById(R.id.bigtext);
bigText.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

1
这是一个简单的解决方案,如果您正在使用TextView,则可以使用它;我没有使用它,因为使用文本字段会使我的视图层次结构变得太深且渲染和布局过于昂贵。相反,我制作了一个自定义视图并在画布上自己绘制文本。 - MrJre
1
+1 我曾经遇到过大段文本消失的问题,花了我一些时间才发现这是硬件加速引起的。这个方法对我有用,但我直接将覆盖写入了XML中:android:layerType="software" - ggenglish
7
很遗憾,这在4.4上似乎不再起作用了(意思是:我不再看到错误信息,但文本没有被绘制)。 - BoD
1
在Android 6.0.1中,使用XML版本解决了我的问题。 - Someone Somewhere
我在另一部手机上尝试了这个解决方法,其中一个字体无法显示。然而,在我的平板电脑上它确实可以显示。有没有更可靠的解决方法? - Someone Somewhere
你有这个 Android bug 数据库中的参考吗? - Stefan Haustein

8

一个想法:也许您可以使用Paint.getTextPath(...)将字体转换为轮廓,并使用此路径来呈现文本。这样应该能够按需要调整路径大小。


看起來能夠運作,很棒。但是繪畫的樣式需要設定填充,而且似乎 getTextPath() 返回的 Path 沒有關閉,所以需要在繪畫之前使用 path.close() 進行關閉。 - MrJre
2
你能否请提供一些相关代码?目前为止,我已经禁用了视图的硬件加速,因为它总是有这个问题。 - android developer
有一个名为 path.close() 的方法可以实现这个功能。 - Eduardo Reis
请将代码放在这里,因为我最终的代码不能正常工作。 - zihadrizkyef

4

setLayerType方法非常有用,但不幸的是它仅支持API >= 11。如果开发的API = 8或更低,则将变得无法使用。

如果可以的话,一个简单的解决方案是仅为导致问题的活动禁用硬件加速。我遇到了这个问题,并通过以下方式解决:

<application
    android:...
    android:hardwareAccelerated="true" >
    <activity ...>
        ...
    </activity>

    <activity
        ...
        android:hardwareAccelerated="false">
        ...
    </activity>
</application>

这个解决方案将禁用硬件加速,仅适用于您不需要它且无法显示大量文本的活动。


2
使用API 8或更低版本,没有硬件加速,因此不需要任何硬件加速。android:hardwareAccelerated仅适用于API 11及以上版本。另请参阅http://developer.android.com/guide/topics/graphics/hardware-accel.html。 - MrJre
我正在开发一个应用程序,必须在API 8上运行,但需要API 11的Admob。因此,我必须找到一种方法,仅使用从API v. 8开始可用的公共API来解决该问题。这种方法可以解决这个问题。 - marzapower

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