Android Paint.setTypeface не работает для курсива

Paint.setTypeface не работает для курсива или я делаю что-то не так. Я могу создать нормальный, полужирный, моноширинный и засекреченный текст, но я не могу создать курсивный текст. Он всегда выглядит нормально (или в случае полужирным шрифтом, он выглядит полужирным шрифтом).

    //This will appear monospace
    paint.setTypeface(Typeface.MONOSPACE);
    canvas.drawText("foo", 10, 10, paint);

    //This will appear serif
    paint.setTypeface(Typeface.SERIF);
    canvas.drawText("foo", 10, 10, paint);

    //This will appear bold
    paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
    canvas.drawText("foo", 10, 10, paint);

    //This will NOT appear italic <===  PROBLEM
    paint.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));
    canvas.drawText("foo", 10, 10, paint);

    // This isn't working either <===  PROBLEM
    paint.setTypeface(Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC));

Итак, теперь вопрос: существует ли известное обходное решение для этого? Моя простая цель - нарисовать некоторые слова с курсивом...

Ответ 1

После того, как я столкнулся с такой же трудностью, я нашел решение, ловив рыбу в исходном коде TextView. Попробуйте следующее:

paint.setTextSkewX(-0.25f);

Ответ 2

У меня та же проблема. похоже, что не все шрифты для Android поддерживают стиль ITALIC. Попробуйте следовать, я работал у меня:

paint.setTypeface(Typeface.create(Typeface.SERIF,Typeface.ITALIC));

Прекрасно работает с SERIF. DEFAULT, MONOSPACE, SANS_SERIF использует этот стиль.

P.S. Я говорю об API 10.

Ответ 3

Чтобы получить курсивный режим для устройств, которые не поддерживают его для шрифта по умолчанию, мы должны использовать метод setTextSkewX. Однако, прежде чем применять его, мы должны быть уверены, что курсивный режим не поддерживается. Мы достигаем этого, создавая временный объект TextView и измеряя его ширину в обоих режимах (NORMAL и ITALIC). Если их ширина одинаковая, то это означает, что режим ITALIC НЕ поддерживается.

Пожалуйста, взгляните на решение, представленное в другом вопросе: устройства Samsung, поддерживающие setTypeface (Typeface.Italic)?