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");最后一个图像是使用默认而不是位图时文本的样子。

对此问题的任何帮助将不胜感激!

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

4

2 回答 2

2

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

于 2013-07-24T17:34:17.070 回答
0

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

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

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

于 2013-07-28T03:55:04.790 回答