RemoteViews (Widget) 使用 Bitmap 时文本模糊
Posted
技术标签:
【中文标题】RemoteViews (Widget) 使用 Bitmap 时文本模糊【英文标题】:RemoteViews (Widget) has fuzzy text when using a Bitmap 【发布时间】:2013-07-19 20:23:54 【问题描述】:要在我的小部件上放置自定义字体,我正在创建一个包含字体的位图,然后将该位图放入我的 RemoteViews 中。但是,位图上的文本非常模糊,与 Activity 中的清晰程度相比,看起来确实像素化了。
已经有很多应用程序在小部件上使用自定义字体。不过,我还没有找到一种可靠的方法来做到这一点。如果有人对此问题有更好的解决方案,我很想听听!
现在这是我用来创建位图并将其放置在小部件上的方法:
RemoteViews widgetView = new RemoteViews(this.getPackageName(), R.layout.widget);
widgetView.setImageViewBitmap(R.id.widgetImage, buildBitmap());
与
public Bitmap buildBitmap()
Bitmap bitmap = Bitmap.createBitmap(160, 84, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
TextPaint textPaint = new TextPaint(TextPaint.LINEAR_TEXT_FLAG | TextPaint.ANTI_ALIAS_FLAG);
textPaint.setTypeface(getFont());
textPaint.setStyle(Style.FILL);
textPaint.setColor(fontColor);
textPaint.setTextSize(fontSize);
StaticLayout staticLayout = new StaticLayout(textString, textPaint, bitmap.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
staticLayout.draw(canvas);
return bitmap;
罪魁祸首小部件!上图是自定义字体,中图是位图上默认的Sans字体,表示不管用什么字体,文字都是模糊的。
最后一张图片是使用默认 remoteView.setTextViewText("Text");
而不是位图时文本的样子。
对于这个问题的任何帮助将不胜感激!
【问题讨论】:
那个 160x84 的尺寸看起来非常小 - 你不应该调整屏幕密度吗? 提醒我为什么不能只使用自定义字体的文本视图? @Tom 因为它是一个小部件。RemoteViews
不允许你这样做。
您好,任何人都可以帮助解决这个问题。我有同样的问题..!
【参考方案1】:
您不能假设为 160x84。这是一个非常小的尺寸。如您所见,缩放后可能会很模糊。相反,您需要根据给定sp
处的文本测量值实际测量位图大小。 Paint.measureText
有时对于这些类型的事情来获得宽度很有用,但你也需要高度才能正确地做到这一点,所以getTextBounds
可能更有用。您可能还需要添加一些填充,但这应该可以帮助您入门。正如您在图片中看到的那样,清晰度并不是您必须处理的唯一问题。您还必须弄清楚自动换行(也许Paint.measureText
会派上用场)。
【讨论】:
将 160x84 更改为 300x400 之类的肯定会有所作为!但是,它还不是小部件的实际大小。我已经尝试过 measureText 和 getTextBounds。它们返回非常大的数字,例如 Paint.measureText() 返回 7375。 您是否使用适当的值在您的绘画对象上调用了“setTextSize”和“setTextScale”? 现在我将 18 传递给setTextSize
,但没有对 setTextScaleX
做任何事情。更改 setTextScaleX
只会向左或向右拉伸文本,使其倾斜。【参考方案2】:
您使用的ImageView
需要添加android:scaleType="matrix"
属性。编辑您的小部件布局 xml 并在需要的地方添加该属性。 ImageView 将不会尝试缩放您的图像以适合视图。
正如之前的帖子所说,您的像素尺寸错误。您应该记录每个小部件的大小,以便以后可以使用它来创建位图。
如果您需要帮助解决这个问题,我可以发布一些代码。接受这个答案并专门发布关于该问题的另一个答案,我将在那里用代码回答。
【讨论】:
请不要勒索用户接受答案或发布新的、有点相关的问题。如果你能帮忙,请帮忙。如果没有,不要。 我没有敲诈任何人。我实际上已经发布了他问题的答案。重新阅读我的回复后,我可以看到它可能会以不同的方式出现,以及我的措辞如何可以更好。我只是说另一个问题本质上是无关的,如果他想回答这个问题,他应该发布另一个问题。以上是关于RemoteViews (Widget) 使用 Bitmap 时文本模糊的主要内容,如果未能解决你的问题,请参考以下文章
桌面小组件AppWidget - RemoteViews for widget update exceeds maximum bitmap memory usage
桌面小组件AppWidget - RemoteViews for widget update exceeds maximum bitmap memory usage
在 AsyncTask 回调后更新基于集合的 Widget RemoteViews
桌面小组件AppWidget - RemoteViews for widget update exceeds maximum bitmap memory usage