Android 使用位图时,RemoteView(小部件)具有模糊文本

Android 使用位图时,RemoteView(小部件)具有模糊文本,android,bitmap,android-widget,android-canvas,remoteview,Android,Bitmap,Android Widget,Android Canvas,Remoteview,要在我的小部件上放置自定义字体,我将创建一个包含该字体的位图,然后将该位图放置到我的RemoteView中。然而,位图上的文本非常模糊,与活动中的清晰程度相比,它看起来确实是像素化的 已经有相当多的应用程序在小部件上使用自定义字体。不过,我还没有找到一个可靠的方法来做到这一点。如果有人对这个问题有更好的解决办法,我很乐意听到 现在,这就是我用来创建位图并将其放置在小部件上的内容: RemoteViews widgetView = new RemoteViews(this.getPackageNa

要在我的小部件上放置自定义字体,我将创建一个包含该字体的位图,然后将该位图放置到我的RemoteView中。然而,位图上的文本非常模糊,与活动中的清晰程度相比,它看起来确实是像素化的

已经有相当多的应用程序在小部件上使用自定义字体。不过,我还没有找到一个可靠的方法来做到这一点。如果有人对这个问题有更好的解决办法,我很乐意听到

现在,这就是我用来创建位图并将其放置在小部件上的内容:

RemoteViews widgetView = new RemoteViews(this.getPackageName(), R.layout.widget);
widgetView.setImageViewBitmap(R.id.widgetImage, buildBitmap());


罪魁祸首!顶部的一个是自定义字体,中间的图像是位图上的默认Sans字体,以显示无论使用何种字体,文本都是模糊的

最后一个图像是使用默认的
remoteView.setTextViewText(“text”)时文本的外观而不是位图

在此问题上的任何帮助都将不胜感激


你不能假设160x84。那是一个很小的尺寸。当缩放时,正如您所看到的,它很可能是模糊的。相反,您需要根据给定
sp
处的文本测量值来实际测量位图大小。有时候这类东西很有用,可以得到宽度,但是你也需要高度来做正确的事情,所以可能更有用。您可能还需要添加一些填充,但这应该可以让您开始。正如你在照片中看到的,清晰度并不是你必须处理的唯一问题。您还必须弄清楚单词包装(也许这里是方便的地方)。

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

正如之前的文章所说,你的像素尺寸是错误的。您应该维护每个小部件大小的记录,以便以后可以使用它创建位图


如果你需要帮助解决这个问题,我可以发布一些代码。接受这个答案,并专门发布另一个关于这个问题的帖子,我会用代码来回答。

160x84的大小看起来太小了-你不应该调整屏幕密度吗?提醒我为什么你不能只拥有一个自定义字体的textview?@Tom,因为它是一个小部件<代码>远程视图
不允许您这样做。您好,任何人都可以在这个问题上提供帮助。我也有同样的问题。。!将160x84改为300x400肯定会有所不同!然而,它还不是小部件的实际大小。我尝试了measureText和getTextBounds。它们返回非常大的数字,例如Paint.measureText()返回7375。您是否使用适当的值调用了Paint对象上的“setTextSize”和“setTextScale”?现在我将18传递到
setTextSize
,但不使用
setTextScaleX
执行任何操作。更改
setTextScaleX
只会将文本向左或向右拉伸,使其倾斜。请不要强迫用户接受答案或发布新的相关问题。如果你能帮忙,就帮忙。如果没有,就不要我没有勒索任何人。。我已经把他的问题的答案贴出来了。在重新阅读我的答复后,我可以看到它可能会以不同的方式出现,以及我的措辞如何可以更好。我只是说,另一个问题基本上是无关的,如果他想回答这个问题,他应该发布另一个问题。
    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;
    }