三星设备支持setTypeface(Typeface.Italic)?

时间:2012-05-02 19:06:10

标签: android typeface italic

我在应用程序中使用自定义View组件,通过Paint / Canvas在屏幕上绘制一些文本。

我使用以下代码(在调用canvas.drawText()之前)使我的文本显示为Italic:

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

适用于三星Galaxy Nexus。但在三星Epic 4g(Galaxy S),三星Epic Touch(Galaxy SII)和三星变换超我的文字仍然是非斜体。

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

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

在java或

android:textStyle="italic"

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

有没有人知道另一种方法,我可以设置canvas的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

再次编辑:为了完成此功能,我最终将itotoic版本的roboto字体添加到我的资源文件夹并将其应用为字体。如果有人找到一种方法让它工作而不用这种方式添加它,我仍然会感兴趣。

4 个答案:

答案 0 :(得分:1)

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

  

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

修改

而不是defaultFromStyle,请尝试使用Typeface.create (Typeface family, int style)(记录为here)。

答案 1 :(得分:1)

尝试将直接值传递给setTypeFace api,直到找到合适的值。如果使用其他方法进行斜体处理,那么TypeFace类(在这些构建中)中的常量定义可能会出现一些问题。

mPaintText.setTypeface(Typeface.defaultFromStyle(0)); // then 1, 2, 3

答案 2 :(得分:0)

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

官方的Roboto Android字体可用here

答案 3 :(得分:0)

我们需要检查默认字体是否支持ITALIC模式。我们通过创建一个时间TextView对象并在两种模式(NORMAL和ITALIC)中测量其宽度来实现。如果它们的宽度不同,则表示支持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);
}