【问题标题】:Html in text view with different fonts for bold and italic文本视图中的 Html,具有不同字体的粗体和斜体
【发布时间】:2019-03-01 03:22:30
【问题描述】:

我正在尝试在 TextView 上使用自定义字体。 TextView 文本设置为 textView1.setText(Html.fromHtml(htmlText));

html 包含粗体和斜体跨度

现在。我购买了自定义字体。该字体带有 3 个不同的文件 (ttf)。一种用于常规,一种用于粗体和斜体。

如何将这三个字体文件应用到 textview?

【问题讨论】:

    标签: android


    【解决方案1】:

    此链接将帮助您了解如何自定义 android 字体:http://mobile.tutsplus.com/tutorials/android/customize-android-fonts/

    其中涉及到如何将这些字体文件应用到 textview 中,您需要先将它们集成到您的项目中:

    Typeface tf = Typeface.createFromAsset(this.getAssets(),
            "fonts/xxx.TTF");
    txt1.setTypeface(tf);
    

    ttf文件应该放在--> assets/fonts/xxx.TTF

    所有需要的细节都在段落中:“使用自定义字体”

    【讨论】:

    • 使用包含不同样式(Regular、Bold、Italic 等)的单一字体文件很容易。问题在于每种样式位于不同文件中的字体(即 font_regular.ttf、font_bold.ttf、font_italic.ttf)。使用setTypeface 只能设置一种字体,因此只能使用一种样式。 Eli Konky 我需要的是在单个 TextView 中使用多个字体文件。
    • 据此:stackoverflow.com/questions/10191510/… 以及 setTypeface() 将用您的自定义 ttf 文件替换 android 使用的默认 ttf 文件的事实:(目前)使用的唯一方法单个文本视图的不同字体是将这些字体手动合并到一个 ttf 文件中。这可以通过使用字体编辑器(如sourceforge.net/projects/ttfedit)来完成。希望对您有所帮助。
    • 我没有看到在 TTFEdit(或我测试过的任何其他字体编辑软件)中合并两个文件的选项。不得不问关于合并字体文件的问题:)
    • 这里是一个例子:sourceforge.net/projects/ttfedit你可以谷歌TTF编辑器
    • 我在那个链接中看不到示例,您能详细说明如何合并字体文件吗?
    【解决方案2】:

    对于 API 16+,现在最好的方法是定义一个字体资源文件,如果你使用 v26 以上的支持库或新的 AndroidX 库,基本上你在字体文件夹中添加你的普通和斜体 ttf 字体文件并创建一个字体资源xml,基本上让它看起来像

    <?xml version="1.0" encoding="utf-8"?>
    <font-family xmlns:app="http://schemas.android.com/apk/res-auto">
    <font
        app:fontStyle="normal"
        app:fontWeight="400"
        app:font="@font/custom_regular_font" />
    <font
        app:fontStyle="italic"
        app:fontWeight="400"
        app:font="@font/custom_italic_font" />
    <font
        app:fontStyle="normal"
        app:fontWeight="700"
        app:font="@font/custom_bold_font" />
    </font-family>
    

    最后一个是粗体字体,假设 custom_font_family.xml 以 android:fontFamily="@font/custom_font_family" 的形式将这个 xml 应用到您的文本视图,现在您使用 fromHtml 设置的具有三种跨度类型中的任何一种的任何 html 文本都将使用适当的字体,在需要时,这甚至可以让您拥有一个自定义字体系列,混合完全不同的字体,而不必完全来自同一个系列。

    【讨论】:

      【解决方案3】:

      我想您想对代码进行快速重构以合并资产。

      我会扩展 TextView 并尝试解析 HTML 并在 onDraw 应用正确的字体。

      覆盖setText 并解析参数,为字符和应使用的正确字体创建映射。

      然后,覆盖onDraw,在绘制之前,根据您在上一步创建的地图更改super.getPaint()的字体。

      代码应该看起来像How to correctly draw text in an extended class for TextView? 中的onDraw 方法中的代码,但是您将设置先前确定的字体而不是应用super.getTypeface()

      希望对你有帮助

      【讨论】:

        【解决方案4】:

        您是否尝试将所有字体一一应用到相同的 textView 文本。 我认为您可以将更多效果应用于相同的 TextView。

        Milos 的代码是正确的。 另外,我已经提出了自己的解释。 您可以将字体添加到 assets 文件夹中,然后您可以将该字体逐一应用到 textView。

        不确定,但可能对您有用。

        我的代码:

        Typeface font1 = Typeface.createFromAsset(getAssets(), "YOUR_FONT1.ttf");
        Typeface font2 = Typeface.createFromAsset(getAssets(), "YOUR_FONT2.ttf");
        Typeface font3 = Typeface.createFromAsset(getAssets(), "YOUR_FONT3.ttf");
        
        chips_text.setTypeface(font1);
        chips_text.setTypeface(font2);
        chips_text.setTypeface(font3);
        

        随时发表评论和查询。

        【讨论】:

        • 是的,我做到了。不幸的是,每次调用 setTypeface 都会覆盖之前的调用。
        • 好的,那么您必须遵循米洛斯的回答。您必须创建一种包含您想要的所有内容的字体,然后将其设置为指定的视图。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        • 2013-02-24
        相关资源
        最近更新 更多