使用Bitmap时,RemoteViews(小部件)显示模糊的文本

4
为了在我的小部件上放置自定义字体,我正在创建一个包含该字体的位图,然后将该位图放入我的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");而不是位图时,最后一张图片显示出文本的样子。
如有任何关于这个问题的帮助将不胜感激! enter image description here enter image description here enter image description here

2
那个160x84的尺寸看起来非常小,你不应该根据屏幕密度进行调整吗? - Delyan
提醒我为什么你不能只是使用自定义字体的TextView? - Tom
3
因为它是一个小部件,所以“RemoteViews”不允许您这样做。 - kabuko
有人能帮忙解决这个问题吗?我也遇到了同样的问题..! - Usman
2个回答

2
你不能假设160x84。这是一个非常小的尺寸。当缩放时,它很可能会变得模糊,正如您所看到的那样。相反,您需要根据给定的sp量测文本的实际大小来测量位图大小。对于这些情况,Paint.measureText有时很有用,以获取宽度,但您还需要高度才能正确执行,因此getTextBounds可能更有用。您还可能需要添加一些填充,但这应该可以让您入门。正如您在图片中看到的那样,清晰度不是您必须处理的唯一问题。您还需要解决单词换行问题(也许这就是Paint.measureText派上用场的地方)。

将160x84更改为类似300x400的尺寸确实有所改善!但它还不是小部件的实际大小。我已经尝试了measureText和getTextBounds两种方法。它们返回非常大的数字,例如Paint.measureText()返回7375。 - Gatekeeper
你是否在你的画笔对象上使用了适当的值调用了“setTextSize”和“setTextScale”方法? - kabuko
现在我正在将18传递到setTextSize,但没有使用setTextScaleX。更改setTextScaleX只会拉伸文本向左或向右,使其倾斜。 - Gatekeeper

0

您正在使用的ImageView需要添加android:scaleType="matrix"属性。编辑您的小部件布局xml并在需要的位置添加该属性。然后,ImageView将不会尝试缩放图像以适应视图。

如先前的帖子所述,您的像素尺寸是错误的。您应该维护每个小部件的大小记录,以便稍后用于创建位图。

如果您想要帮助解决这个问题,我可以发布一些代码。接受此答案并发布另一个有关该问题的帖子,我将在那里回答并提供代码。


3
请不要勒索用户接受答案或发布新的、有点相关的问题。如果你能帮忙,就帮助一下。如果不能,就不要进行干扰。 - Delyan
我并没有勒索任何人,实际上我已经回答了他的问题。重新阅读我的回复后,我可以看出它可能会被误解,并且我的措辞可以更好。我只是在说另一个问题本质上与此无关,如果他想要回答那个问题,他应该发布另一个问题。 - Simon

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