更新 CustomContainer 子 TouchGFX

Posted

技术标签:

【中文标题】更新 CustomContainer 子 TouchGFX【英文标题】:Update CustomContainer children TouchGFX 【发布时间】:2020-06-14 08:34:24 【问题描述】:

如果我有一个带有 2 个文本区域的 CustomContainer,是否可以在运行时更新这些文本区域的文本?请注意,自定义容器位于滚动列表中。

【问题讨论】:

这个问题解决了吗? 不,没有解决 好的,我有一些链接可以帮助你:ScrollWheel documentationAdding User code to ScrollWheel 这些链接已经不存在了。 自@VictorGram 发布以来,文档已从 ZenDesk 移出。 support.touchgfx.com/4.18/docs/development/ui-development/… 【参考方案1】:

是的,这是可能的。也许这个迟到的答案可以帮助某人。

我有一个屏幕,其中列出了实际失败的自定义小部件。 自定义容器有 4 个文本区域:日期、时间、错误组件、错误文本。 在这里,我以 3 种方式设置文本,日期和时间的文本是从数字时间值生成的,标题的文本是从资源中读取的,错误详细信息的文本是从资源中读取的,但值是事后填写。

屏幕内容失效后,无论是滚动还是调用invalidate,touchgfx运行时都会自动调用回调函数xxxUpdateItem。您必须在屏幕的视图类中覆盖并实现它。 调用此函数时会引用您的自定义小部件和当前项目的实际索引,如下所示:

void MessageScreenView::scrollList1UpdateItem(CustomContainerFailureOrInfo& item, int16_t itemIndex)  

从此您可以调用自定义小部件的函数来设置新文本,例如:

void CustomContainerFailureOrInfo::setDetails(uint16_t itemIdx, uint32_t dateTime, uint16_t captionTextId, uint16_t detailTextId, const char16_t * templateF1, float f1, const char16_t * templateF2, float f2)

    setDateTime(dateTime);
    setCaption(captionTextId);
    setDetailText(detailTextId, templateF1, f1, templateF2, f2);

日期和时间的文本是从 time_t 值生成的。 使用文本小部件的 setTypedText 函数从资源中读取标题,例如:

void CustomContainerFailureOrInfo::setCaption(TypedTextId t)

    caption.setTypedText(TypedText(t));
    caption.setWideTextAction(WIDE_TEXT_WORDWRAP);
    caption.invalidate();

我遇到了问题,一些错误消息应该显示与错误相关的值,而其他应该只显示 plein 文本。我通过使用值通配符并传递格式字符串和值来解决它:

void CustomContainerFailureOrInfo::setDetailText(TypedTextId t, const char16_t * templateF1, float f1, const char16_t * templateF2, float f2)

    text.setTypedText(TypedText(t));
    Unicode::snprintf(textBuffer1, TEXTBUFFER1_SIZE, "");
    if (templateF1)
    
        if (awiStrUtil::isPrintfFloatContained16(templateF1))
        
            Unicode::snprintfFloat(textBuffer1, TEXTBUFFER1_SIZE, reinterpret_cast<const Unicode::UnicodeChar *> (templateF1), f1);
        
        else
        
            // attention: (const char16_t*)
            Unicode::snprintf(textBuffer1, TEXTBUFFER1_SIZE, reinterpret_cast<const Unicode::UnicodeChar *> (templateF1));
        
    
    // similar code removed: if (templateF2) ...
    text.setWideTextAction(WIDE_TEXT_WORDWRAP);
    text.invalidate();

【讨论】:

以上是关于更新 CustomContainer 子 TouchGFX的主要内容,如果未能解决你的问题,请参考以下文章

HarmonyOS 非侵入式事件分发设计

立即响应ScrollView上的子视图的手势

CoreAnimation 性能分析 - CAReplicatorLayer 和 CAShapeLayer

自定义容器:@IBOutlets nil 即使视图显示正确

为啥loop之后就可以子线程更新ui

更新一些子视图而不更新所有子视图