Подтвердить что ты не робот

Малые Caps на TextViews, EditTexts и кнопки в Android

Есть ли что-то, что я могу сделать, чтобы текст выглядел в маленьких шапках/столице? Как описано здесь: http://en.wikipedia.org/wiki/Small_caps. Я использовал конвертер, но некоторые символы отсутствуют.

4b9b3361

Ответ 1

EDIT 2015-08-02: по API 21 (Lollipop) вы можете просто добавить:

android:fontFeatureSettings="smcp"

для вашего объявления TextView в XML или во время выполнения, вызовите:

textView.setFontFeatureSettings("smcp");

Конечно, это работает только для API 21 и выше, поэтому вам все равно придется обрабатывать старое решение вручную, пока вы не будете поддерживать только Lollipop и выше.


Будучи немного похожим на типографию, это казалось очень хорошим вопросом. Мне нужно узнать больше о Unicode сегодня, а также ответить на ваш вопрос.:)

Во-первых, вам понадобится шрифт, который включает в себя "фактические" символы малой буквы. Я предполагаю, что вы знаете, что, поскольку вы спрашиваете, но обычно большинство профессиональных шрифтов включают их. К сожалению, большинство профессиональных шрифтов не лицензированы для распространения, поэтому вы не сможете использовать их в своем приложении. Во всяком случае, в случае, если вы найдете его (я использовал Chaparral Pro в качестве примера здесь), вот как вы можете получить маленькие шапки.

От этот ответ Я обнаружил, что символы маленьких шапок (для A-Z) расположены начиная с Unicode-UF761. Поэтому я построил отображение этих символов:

private static char[] smallCaps = new char[]
{
        '\uf761', //A
        '\uf762',
        '\uf763',
        '\uf764',
        '\uf765',
        '\uf766',
        '\uf767',
        '\uf768',
        '\uf769',
        '\uf76A',
        '\uf76B',
        '\uf76C',
        '\uf76D',
        '\uf76E',
        '\uf76F',
        '\uf770',
        '\uf771',
        '\uf772',
        '\uf773',
        '\uf774',
        '\uf775',
        '\uf776',
        '\uf777',
        '\uf778',
        '\uf779',
        '\uf77A'   //Z
};

Затем добавлен вспомогательный метод для преобразования входной строки в ту, чьи строчные буквы были заменены их эквивалентами Small Caps:

private static String getSmallCapsString (String input) {
    char[] chars = input.toCharArray();
    for(int i = 0; i < chars.length; i++) {
        if(chars[i] >= 'a' && chars[i] <= 'z') {
            chars[i] = smallCaps[chars[i] - 'a'];
        }
    }
    return String.valueOf(chars);
}

Тогда просто используйте это где угодно:

String regularCase = "The quick brown fox jumps over the lazy dog.";
textView.setText(getSmallCapsString(regularCase));

Для чего я получил следующий результат:

Example of Small Caps

Ответ 2

Извинения за перетаскивание очень старого вопроса.

Мне понравился подход @kcoppock к этому, но, к сожалению, шрифт, который я использую, пропускает символы маленькой буквы. Я подозреваю, что многие другие окажутся в этой ситуации.

Это вдохновило меня написать небольшой метод утилиты, который будет принимать строку смешанного случая (например, Small Caps) и создать отформатированную растянутую строку, которая выглядит как Sᴍᴀʟʟ Cᴀᴘs, но использует только стандартный AZ.

  • Он работает с любым шрифтом, имеющим символы A-Z - ничего особенного не требуется
  • Это легко использовать в TextView (или любом другом текстовом представлении, если на то пошло)
  • Он не требует HTML
  • Это не требует редактирования исходных строк

Я поставил здесь код: https://gist.github.com/markormesher/3e912622d339af01d24e

Ответ 4

Просто позвоните в эту функцию getSmallCaps (text):

public SpannableStringBuilder getSmallCaps(String text) {

    text = text.toUpperCase();
    text = text.trim();
    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
    if (text.contains(" ")) {
        String[] arr = text.split(" ");
        for (int i = 0; i < arr.length; i++) {
            spannableStringBuilder.append(getSpannableStringSmallCaps(arr[i]));
            spannableStringBuilder.append(" ");
        }
    } else {
        spannableStringBuilder=getSpannableStringSmallCaps(text);
    }
    return spannableStringBuilder;
}


public SpannableStringBuilder getSpannableStringSmallCaps(String text) {

    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(
            text);
    spannableStringBuilder.setSpan(new AbsoluteSizeSpan(36), 0, 1, 0);
    spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), 0, 1, 0);
    spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), 1,
            text.length(), 0);
    return spannableStringBuilder;
}

Ответ 5

Это не мой код, но его работа отлично.

 public SpannableString getSmallCapsString(String input) {
    // values needed to record start/end points of blocks of lowercase letters
    char[] chars = input.toCharArray();
    int currentBlock = 0;
    int[] blockStarts = new int[chars.length];
    int[] blockEnds = new int[chars.length];
    boolean blockOpen = false;

    // record where blocks of lowercase letters start/end
    for (int i = 0; i < chars.length; ++i) {
        char c = chars[i];
        if (c >= 'a' && c <= 'z') {
            if (!blockOpen) {
                blockOpen = true;
                blockStarts[currentBlock] = i;
            }
            // replace with uppercase letters
            chars[i] = (char) (c - 'a' + '\u0041');
        } else {
            if (blockOpen) {
                blockOpen = false;
                blockEnds[currentBlock] = i;
                ++currentBlock;
            }
        }
    }

    // add the string end, in case the last character is a lowercase letter
    blockEnds[currentBlock] = chars.length;

    // shrink the blocks found above
    SpannableString output = new SpannableString(String.valueOf(chars));
    for (int i = 0; i < Math.min(blockStarts.length, blockEnds.length); ++i) {
        output.setSpan(new RelativeSizeSpan(0.8f), blockStarts[i], blockEnds[i], Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
    }

    return output;
}

Пример:

SpannableString setStringObj = getSmallCapsStringTwo("Object"); tvObj.setText(setStringObj);

Ответ 6

в XML edit text имеет свойство: android: capitalize = ""