首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Garmin ConnectIQ SDK格式化和显示长文本

如何使用Garmin ConnectIQ SDK格式化和显示长文本
EN

Stack Overflow用户
提问于 2016-05-16 00:26:24
回答 4查看 1.5K关注 0票数 2

我正在尝试显示一条可能比屏幕宽度更长的消息。设置消息格式以将其显示为多行的最佳方式是什么?

注意,消息来自服务器,所以它不是硬编码的资源字符串。

我看不到有什么工具可以做到这一点,而且Toybox::WatchUi::Text drawable和Dc.drawText似乎都不支持段落格式。

Dc.getTextDimensions允许确定文本的宽度和高度,因此这可能是有帮助的,但本机应用程序(例如消息通知程序)确实会显示格式正确的段落,所以我有一种感觉,我遗漏了什么。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-27 14:08:03

我最后使用启发式算法来计算行中可以容纳的最大字符数,并在必要时对行进行换行:

代码语言:javascript
复制
function formatText(dc, text, width, font) {
    // characters below worked better than "EeeTtaAooiNshRdlcum   "
    // which I used initially and is based on frequency of characters
    // in English words
    var chars = "AbCdEfGhIj";
    var oneCharWidth = dc.getTextWidthInPixels(chars, font) / chars.length();
    var charPerLine = mListWidth / oneCharWidth;
    if (text.length() > charPerLine) {
        var result = text.substring(0, charPerLine);
        result += "\n";
        result += text.substring(charPerLine, text.length());
        return [result, 0];
    } else {
        return [text, 1];
    }
}

我的开源IQ Connect Garminello应用程序中的实际函数是here

票数 1
EN

Stack Overflow用户

发布于 2018-06-10 05:26:03

我想出了一个很好的递归解决方案,它考虑了相当多的可能性(在字符串中有"\n“或”“,如果一个单词太长,它会拆分该单词):

代码语言:javascript
复制
function convertTextToMultiline(dc, text){
var extraRoom = 0.8;
var oneCharWidth = dc.getTextWidthInPixels("EtaoiNshrd",Graphics.FONT_SMALL)/10;
var charPerLine = extraRoom * dc.getWidth()/oneCharWidth;
return convertTextToMultilineHelper(text, charPerLine);
}

function convertTextToMultilineHelper(text, charPerLine) {
    if (text.length() <= charPerLine) {
        return text;
    } else {
        var i = charPerLine + 1;
        for (; i >= 0; i--) {
            if (text.substring(i, i + 1).equals("\n")) {
                break;
            }
        }
        if (i >= 0) {
            var line = text.substring(0, i);
            var textLeft = text.substring(i + 1, text.length());
            var otherLines = convertTextToMultilineHelper(textLeft, charPerLine);
            return line + "\n" + otherLines;
        } else {
            var lastChar = charPerLine + 1;
            while (!(text.substring(lastChar, lastChar + 1).equals(" ") || text.substring(lastChar, lastChar + 1).equals("\n"))&& lastChar >= charPerLine/2) {
                lastChar--;
            }
            if (lastChar >= charPerLine/2) {
                var line = text.substring(0, lastChar + 1);
                var textLeft = text.substring(lastChar + 1, text.length());
                var otherLines = convertTextToMultilineHelper(textLeft, charPerLine);
                return line + "\n" + otherLines;
            } else {
                var line = text.substring(0, charPerLine) + "-";
                var textLeft = text.substring(charPerLine, text.length());
                var otherLines = convertTextToMultilineHelper(textLeft, charPerLine);
                return line + "\n" + otherLines;
            }
        }
    }
}

这可能不是最漂亮或最有效的解决方案,但它肯定有效!

票数 1
EN

Stack Overflow用户

发布于 2017-04-26 19:08:11

我猜您必须使用https://developer.garmin.com/downloads/connect-iq/monkey-c/doc/Toybox/Graphics/Dc.html#getTextWidthInPixels-instance_method对文本宽度进行一些手动计算

我正面临着几乎相同的问题,尽管对于我的解决方案,我将删除不适合屏幕宽度/文本框宽度的字符

我正在制作一个实用函数来计算我可以适应特定宽度的字符串,如下所示:

代码语言:javascript
复制
function getTextWidthMaxWidth(dc, text, font, maxWidth) {
    var dispText = text;
    //chunk off a char until it fits maxWidth
    while (dc.getTextWidthInPixels(dispText, font) > maxWidth) {
        dispText = dispText.subString(0, dispText.Length() - 1);
    }
    return dispText;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37240753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档