使用位图时,RemoteViews(Widget)具有模糊文本

时间:2013-07-20 17:41:45

标签: android bitmap android-widget android-canvas remoteview

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

已经有很多应用程序在小部件上使用自定义字体。尽管如此,我还没有找到一个可行的方法。如果有人能够更好地解决这个问题,我很乐意听到它!

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

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 个答案:

答案 0 :(得分:2)

你不能假设160x84。这是一个非常小的尺寸。缩放时,您可能会看到模糊。相反,您需要根据给定sp处文本的度量来实际测量位图大小。有时候Paint.measureText对于获取宽度这些类型的东西很有用,但是你也需要高度来做正确的事情,所以getTextBounds可能更有用。您可能还需要添加一些填充,但这应该让您开始。正如您在照片中看到的那样,清晰度并不是您必须处理的唯一问题。你也必须弄清楚自动换行(也许这里Paint.measureText会派上用场)。

答案 1 :(得分:0)

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

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

如果您需要帮助,我可以发布一些代码。接受这个答案并专门发布另一个关于该问题的答案,我会用代码回答那里。