字体太大而无法放入缓存
Posted
技术标签:
【中文标题】字体太大而无法放入缓存【英文标题】:Font size too large to fit in cache 【发布时间】:2011-09-09 08:36:41 【问题描述】:所以我最近切换到了 android 3.0 (honeycomb),但我在硬件渲染方面遇到了一些问题,特别是在我编写的某个自定义视图中,我使用 200 的字体大小来显示一些文本。
不幸的是,鉴于我在日志中遇到的错误,openGLRenderer 似乎不太喜欢那种相当大的字体:
06-06 16:22:00.080: ERROR/OpenGLRenderer(2503): Font size to large to fit in cache. width, height = 97, 145
有没有办法解决这个问题(或修复它),以便我可以让文本以所需的字体大小显示?
【问题讨论】:
所以我通过为我需要的所有字符创建该字体大小的图像来解决它,但我可以想象有时你不想做这样的事情,所以保持开放以获得更明确的答案。 【参考方案1】:只是一个想法:也许您可以使用Paint.getTextPath(...) 将字体转换为轮廓,并使用此路径来呈现文本。这应该允许您根据需要调整路径的大小。
【讨论】:
似乎有效,太棒了。绘制样式需要有填充集,似乎getTextPath()返回的路径没有关闭,所以需要在绘制前用path.close()关闭。 能否请您为此发布一些代码?现在,我已经禁用了视图的硬件加速,因为它总是有这个问题。 有一个方法叫path.close()
请将代码放在这里,因为我的代码最终无法正常工作【参考方案2】:
这确实是 Android 操作系统中硬件加速模块中的一个错误。 我认为最好的方法是要求系统避免对包含大尺寸文本的 TextView 进行硬件加速。 为此,只需添加代码:
TextView bigText = (TextView) findViewById(R.id.bigtext);
bigText.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
【讨论】:
这是一个简单的解决方案,如果您使用的是 TextView 则可以使用;我没有使用它,因为使用文本字段,我的视图层次变得很深,并且当时渲染和布局的成本很高。相反,我创建了一个自定义视图并自己在画布上绘制文本。 +1 我的大文本消失了,我花了一段时间才弄清楚这是硬件加速问题。这对我有用,但我将覆盖直接放入 xml:android:layerType="software" 不幸的是,这似乎不再适用于 4.4(意思是:我不再看到错误,但没有绘制文本)。 在 Android 6.0.1 中使用 xml 版本为我解决了这个问题 我在另一部手机上尝试了这种解决方法,但没有显示一种字体。但是,在我的平板电脑上它确实显示。有没有更好更可靠的解决方法?【参考方案3】:setLayerType
方法很有用,但不幸的是,它仅支持 API >= 11。为 API = 8 或更低进行开发将变得无法使用。
如果可以,一个简单的解决方案是仅针对给您带来问题的活动禁用硬件加速。我遇到了这个问题并以这种方式解决了它:
<application
android:...
android:hardwareAccelerated="true" >
<activity ...>
...
</activity>
<activity
...
android:hardwareAccelerated="false">
...
</activity>
</application>
此解决方案将仅针对不需要硬件加速以及无法显示大文本的活动禁用硬件加速。
【讨论】:
API 8 或更低,没有硬件加速,所以没有必要。 android:hardwareAccelerated 仅适用于 API 11 及更高版本。另见developer.android.com/guide/topics/graphics/hardware-accel.html 我正在开发一个必须在 API 8 上运行但 Admob 需要 API 11 的应用程序。因此,我必须找到一种仅使用 API v. 8 中可用的公共 API 来解决问题的方法。而这种方法解决了这个问题。以上是关于字体太大而无法放入缓存的主要内容,如果未能解决你的问题,请参考以下文章
Android:任何设备上的文本框中的字体大小不能大于 717px