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

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

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

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

Это работает на Samsung Galaxy Nexus. Но на Samsung Epic 4g (galaxy S), Samsung Epic Touch (Galaxy SII) и Samsung Transform ultra мой текст все еще не выделен курсивом.

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

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

в Яве или

android:textStyle="italic"

в layout.xml и мой текст отображается курсивом.

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

РЕДАКТИРОВАТЬ:

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

4 ответа

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

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

РЕДАКТИРОВАТЬ

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

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

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

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

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

Нам нужно проверить, поддерживает ли шрифт по умолчанию режим 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);
}
Другие вопросы по тегам