Устройства 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);
}