11

我有一个使用自定义视图组件的应用程序,该组件通过 Paint/Canvas 在屏幕上绘制一些文本。

我正在使用以下代码(在我调用 canvas.drawText() 之前)使我的文本斜体:

mPaintText.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));

这适用于三星 Galaxy Nexus。但在 Samsung Epic 4g (galaxy S)、Samsung Epic Touch (Galaxy SII) 和 Samsung Transform ultra 上,我的文字仍然不是斜体。

有谁知道为什么其中一些三星设备不支持以这种方式设置斜体文本?我知道这些设备能够呈现斜体文本,因为如果我有一个 TextView 我可以使用

tv.setText(Html.fromHtml("<i>sometext</i>");

在 java 或

android:textStyle="italic"

在 layout.xml 中,我的文本显示为斜体。

有谁知道我可以设置画布的 drawText() 方法来绘制可能在这些设备上工作的斜体文本的另一种方法?

编辑:

以下是我在评论中尝试过的一些方法及其结果的列表。事实证明,SERIF 似乎是唯一可以使用的字体。

mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC) //Nothing
mPaint.setTypeface(Typeface.create(Typeface.DEFAULT_BOLD, Typeface.ITALIC) //Nothing
mPaint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.ITALIC) //omg it is italic...But serifs look gross.
mPaint.setTypeface(Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC) //Nothing
mPaint.setTypeface(Typeface.create(Typeface.MONOSPACE, Typeface.ITALIC) //Changes font, but still no italic.
mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD_ITALIC) //Bold but no italic

再次编辑:为了实现这个功能,我最终将斜体版的机器人字体添加到我的资产文件夹并将其应用为字体。如果有人找到一种方法让它工作而不以这种方式添加它,我仍然会感兴趣。

4

4 回答 4

2

可能是您的三星设备没有安装所需字体的原生斜体版本。您可能必须强制系统综合创建斜体样式字体。尝试:

tv.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC), Typeface.ITALIC);

编辑

代替defaultFromStyle,尝试使用Typeface.create (Typeface family, int style)在此处记录)。

于 2012-05-02T19:41:14.653 回答
1

尝试将直接值传递给setTypeFaceapi,直到找到正确的值。如果斜体是通过其他方法进行的,那么TypeFace类中的常量定义可能存在一些问题(在那些构建中)。

mPaintText.setTypeface(Typeface.defaultFromStyle(0)); // then 1, 2, 3
于 2012-05-12T09:31:07.070 回答
0

这是三星的一个错误,正如 FomayGuy 所说,最好的解决方案是将系统字体的斜体版本添加到资产中。

官方 Roboto Android 字体可在此处获得。

于 2013-02-19T20:14:17.573 回答
0

我们需要检查默认字体是否支持斜体模式。我们通过创建一个临时 TextView 对象并在两种模式(NORMAL 和 ITALIC)下测量其宽度来做到这一点。如果它们的宽度不同,则表示支持斜体模式。否则,默认字体不支持它,我们必须使用 setTextSkewX() 方法来倾斜文本。

    mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC));

    // check whether a font supports an italic mode, returns false if it does't
    if (!supportItalicMode(this, Typeface.DEFAULT))
    {
        paint.setTextSkewX(-0.25f);
    }



private boolean supportItalicMode(Context context, Typeface typeFace)
{
    Typeface tfNormal = Typeface.create(typeFace, Typeface.NORMAL);
    Typeface tfItalic = Typeface.create(typeFace, Typeface.ITALIC);

    TextView textView = new TextView(context);
    textView.setText("Some sample text to check whether a font supports an italic mode");

    textView.setTypeface(tfNormal);
    textView.measure(0, 0);
    int normalFontStyleSize = textView.getMeasuredWidth();

    textView.setTypeface(tfItalic);
    textView.measure(0, 0);
    int italicFontStyleSize = textView.getMeasuredWidth();

    return (normalFontStyleSize != italicFontStyleSize);
}
于 2015-10-06T11:39:33.627 回答