Android中的TextViews,EditTexts和Buttons上的小型大写字母

naz*_*naz 12 android text typography

我能做些什么来使文字看起来像小盘/资本吗?如下所述:http://en.wikipedia.org/wiki/Small_caps.我使用了转换器,但缺少一些字符.

kco*_*ock 18

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

android:fontFeatureSettings="smcp"
Run Code Online (Sandbox Code Playgroud)

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

textView.setFontFeatureSettings("smcp");
Run Code Online (Sandbox Code Playgroud)

当然,这仅适用于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
};
Run Code Online (Sandbox Code Playgroud)

然后添加了一个帮助器方法,将输入字符串转换为小写字母已被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);
}
Run Code Online (Sandbox Code Playgroud)

然后在任何地方使用它:

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

为此,我得到以下结果:

小帽子的例子

  • 这些unicode代码点都在PRIVATE_USE_AREA中.据推测,它们完全针对您使用的任何字体.小资本字符的实际代码点是非常不同的.例如.ᴀ是'\ u1D00' (2认同)

Mar*_*her 6

抱怨拖延一个非常古老的问题.

我喜欢@ kcoppock的方法,但遗憾的是我使用的字体缺少小字符.我怀疑很多人会发现自己处于这种状况.

这激发了我写一个小的util方法,它将采用一个混合大小写的字符串(例如Small Caps)并创建一个格式化的spannable字符串,看起来像 S???? C??s只使用标准的AZ字符.

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

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