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