14

我可以做些什么来使文本看起来像小型大写字母/大写字母?如此处所述:http ://en.wikipedia.org/wiki/Small_caps 。我使用了转换器,但缺少一些字符。

4

6 回答 6

22

编辑 2015-08-02:从 API 21(棒棒糖)开始,您可以简单地添加:

android:fontFeatureSettings="smcp"

TextView在 XML 中或在运行时调用您的声明:

textView.setFontFeatureSettings("smcp");

当然,这只适用于 API 21 及更高版本,因此您仍然必须手动处理旧解决方案,直到您仅支持 Lollipop 及更高版本。


作为一个内心深处的排版怪胎,这似乎是一个非常好的问题。我今天要了解更多关于 Unicode 的知识,以及您问题的答案。:)

首先,您需要有一个包含“实际”小型大写字符的字体。我假设您知道,因为您要问,但通常大多数专业字体都包括这些。不幸的是,大多数专业字体未获得分发许可,因此您可能无法在您的应用程序中使用它们。无论如何,如果您确实找到了一个(我在这里以 Chaparral Pro 为例),这就是您获得小型股的方法。

这个答案中,我发现小型大写字符(对于 AZ)位于从 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));

为此,我得到了以下结果:

小型股的例子

于 2013-04-12T06:19:33.677 回答
7

很抱歉提出一个非常古老的问题。

我喜欢@kcoppock 的处理方法,但不幸的是我使用的字体缺少小写字符。我怀疑许多其他人会发现自己处于这种情况。

这启发了我编写一个小 util 方法,它将采用大小写混合的字符串(例如Small Caps)并创建一个格式化的可跨行字符串,看起来像 Sᴍᴀʟʟ Cᴀᴘs但只使用标准 AZ 字符。

  • 它适用于任何具有A-Z字符的字体 - 没有什么特别要求
  • 它很容易在 TextView 中使用(或任何其他基于文本的视图,就此而言)
  • 它不需要任何 HTML
  • 它不需要对您的原始字符串进行任何编辑

我在这里提出了代码:https ://gist.github.com/markormesher/3e912622d339af01d24e

于 2014-09-25T00:08:18.700 回答
0

只需调用此 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;
}
于 2015-04-07T11:51:46.260 回答
0

在此处找到替代方法TextView 中是否可以有多种样式?

基本上你可以使用 html 标签来格式化字符的大小并给出一个小写的效果......

于 2013-04-13T05:58:55.533 回答
0

这不是我的代码,但它可以完美运行。

 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);
于 2015-08-10T13:40:56.620 回答
-2

在 XML 编辑文本中具有属性:android:capitalize=""

于 2013-04-12T05:03:31.047 回答