我正在尝试显示一条可能比屏幕宽度更长的消息。设置消息格式以将其显示为多行的最佳方式是什么?
注意,消息来自服务器,所以它不是硬编码的资源字符串。
我看不到有什么工具可以做到这一点,而且Toybox::WatchUi::Text drawable和Dc.drawText似乎都不支持段落格式。
Dc.getTextDimensions允许确定文本的宽度和高度,因此这可能是有帮助的,但本机应用程序(例如消息通知程序)确实会显示格式正确的段落,所以我有一种感觉,我遗漏了什么。
发布于 2017-05-27 14:08:03
我最后使用启发式算法来计算行中可以容纳的最大字符数,并在必要时对行进行换行:
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。
发布于 2018-06-10 05:26:03
我想出了一个很好的递归解决方案,它考虑了相当多的可能性(在字符串中有"\n“或”“,如果一个单词太长,它会拆分该单词):
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;
}
}
}
}
这可能不是最漂亮或最有效的解决方案,但它肯定有效!
发布于 2017-04-26 19:08:11
我猜您必须使用https://developer.garmin.com/downloads/connect-iq/monkey-c/doc/Toybox/Graphics/Dc.html#getTextWidthInPixels-instance_method对文本宽度进行一些手动计算
我正面临着几乎相同的问题,尽管对于我的解决方案,我将删除不适合屏幕宽度/文本框宽度的字符
我正在制作一个实用函数来计算我可以适应特定宽度的字符串,如下所示:
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;
}
https://stackoverflow.com/questions/37240753
复制相似问题