如何在 android 复杂功能中更改文本字体

How to change text font in android complication

Android 文档说 androidx.wear.watchface.complications.rendering.ComplicationDrawable 具有 textTypeface 和 titleTypeface 属性。但是我没有找到如何使用它的信息。 我试图将字体资源、字体系列资源传递到那里,但没有效果。我需要传递什么才能生效?

是否可以更改 Drawable complication 中的字体样式?

虽然无法更改字体本身(据我所知),但您可以更改字体。如果您在 GitHub 上查看 Google 的表盘示例项目,您可以在 drawable 文件夹中找到一些复杂功能样式。在这里您将看到如何更改字体的示例:

app:textTypeface="sans-serif-condensed"
app:titleTypeface="sans-serif-condensed"

我无法找到所有可用选项的完整 up-to-date 列表,但过去曾为 Roboto 工作的一些选项是:

"sans-serif"
"sans-serif-light"
"sans-serif-condensed"
"sans-serif-black"
"sans-serif-thin"
"sans-serif-medium"

可以为并发症应用自定义字体。

这是我得到它的方法(在给你带来并发症之前使用它 - 当调用 complication.render(canvas, zonedDateTime, renderParameters) 时):

ComplicationDrawable.getDrawable(context, complicationStyle)?.apply {
    activeStyle.run {
        //... other attributes
        setTextTypeface(ResourcesCompat.getFont(context!!, R.font.your_font_resource)!!)
    }
    (complication.renderer as CanvasComplicationDrawable).drawable = this
}

我知道这不是最好的实现,但它正在运行(使用 android 11、galaxy watch 4 one ui 4.0 测试)

在Java中,您可以按如下方式更改字体、文字颜色和背景颜色:

private final Typeface mExoBold = ResourcesCompat.getFont(getApplicationContext(), R.font.exo_semibold);
complicationDrawable.setTextTypefaceActive(mExoBold);
complicationDrawable.setTextColorActive(Color.YELLOW);
complicationDrawable.setBackgroundColorActive(Color.argb(0xFF, 0x20, 0x20, 0x20));

不过,我还没有找到以这种方式更改字体大小的方法。如果您想 完全 重新格式化并发症,如果您使用的是 Java 中的旧并发症库,请尝试以下操作:

ComplicationText compTitle = null, compText = null;
String title = "", text = "";

if (complicationData.getType() == ComplicationData.TYPE_SHORT_TEXT) {
    compTitle   = complicationData.getShortTitle();
    compText    = complicationData.getShortText();
}
else if (complicationData.getType() == ComplicationData.TYPE_LONG_TEXT) {
    compTitle   = complicationData.getLongTitle();
    compText    = complicationData.getLongText();
}

if (compTitle != null) {
    try { 
        title       = compTitle.getText(context, currentTimeMillis()).toString(); 
    } catch (Exception unused) { 
        title       = ""; 
    }
}

if (compText != null) {
    try { 
        text        = compText.getText(context, currentTimeMillis()).toString(); 
    } catch (Exception unused) { 
        text        = ""; 
    }
}

现在您已经在字符串变量中获得了文本值,您可以以任何您喜欢的方式显示它们(是的,我知道 ComplicationText 已被弃用,但话又说回来,ComplicationData 也是如此;我还没有还想出了如何在 Java).

中使用新的复杂功能库