Малые Caps на TextViews, EditTexts и кнопки в Android
Есть ли что-то, что я могу сделать, чтобы текст выглядел в маленьких шапках/столице? Как описано здесь: http://en.wikipedia.org/wiki/Small_caps. Я использовал конвертер, но некоторые символы отсутствуют.
Ответы
Ответ 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
Ответ 3
Найдена альтернатива здесь Возможно ли иметь несколько стилей внутри TextView?
В принципе вы можете использовать html-теги, форматируя размер символов и придавая эффект малым шарикам....
Ответ 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 = ""