Устройства Samsung, поддерживающие setTypeface (Typeface.Italic)?

У меня есть приложение, которое использует пользовательский компонент View, который рисует какой-то текст на экране с помощью Paint/Canvas.

Я использую следующий код (прежде чем я вызову canvas.drawText()), чтобы сделать текст курсивом:

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

Это работает на Samsung Galaxy Nexus. Но на Samsung Epic 4g (галактика S), Samsung Epic Touch (Galaxy SII) и Samsung Transform ультра мой текст по-прежнему не является курсивом.

Кто-нибудь знает, почему некоторые из этих устройств samsung не поддерживают установку курсивного текста таким образом? Я знаю, что устройства способны отображать курсивный текст, потому что, если у меня есть TextView, я могу использовать

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

в java или

android:textStyle="italic"

в layout.xml, и мой текст выделен курсивом.

Кто-нибудь знает по-другому, что я могу установить метод canvas drawText() для рисования текста курсивом, который может работать на этих устройствах?

EDIT:

Вот список некоторых способов, которые я пробовал с их результатом в комментариях после. Оказывается, 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

ИЗМЕНИТЬ СНОВА: Чтобы сделать эту функцию, я в итоге добавил курсивную версию шрифта roboto в свою папку с ресурсами и применил ее как шрифт. Мне все равно будет интересно, если кто-нибудь найдет способ заставить его работать, не добавляя его таким образом.

Ответ 1

Возможно, ваше устройство Samsung не имеет установленной курсивной версии нужного шрифта. Возможно, вам придется заставить систему создать шрифт в стиле курсива синтетически. Попробуйте:

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

ИЗМЕНИТЬ

Вместо defaultFromStyle попробуйте использовать Typeface.create (Typeface family, int style) (зарегистрированный здесь).

Ответ 2

Попробуйте передать прямые значения в setTypeFace api, пока не найдете правильный. Если курсивом работает другие методы, то в константах в классе TypeFace (в этих сборках) может возникнуть некоторая проблема.

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

Ответ 3

Это ошибка от Samsung, и лучшим решением является, как сказал FomayGuy, добавить курсивную версию системного шрифта в активы.

Официальный шрифт Roboto Android доступен здесь.

Ответ 4

Нам нужно проверить, поддерживает ли стандартный шрифт режим ITALIC. Мы делаем это, создавая временный объект 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);
}