如何水平居中对齐文本?

Posted

技术标签:

【中文标题】如何水平居中对齐文本?【英文标题】:How to center align text horizontally? 【发布时间】:2020-11-02 21:41:22 【问题描述】:

我正在 ImGui 中创建文本。它会自动右对齐,我如何让一个文本居中对齐?

ImGui::Text("Example Text");

我不相信有这样的功能。我知道你可以为一个框或小部件做到这一点,但是对于一个简单的文本我该怎么做呢?

【问题讨论】:

【参考方案1】:
void TextCentered(std::string text) 
    auto windowWidth = ImGui::GetWindowSize().x;
    auto textWidth   = ImGui::CalcTextSize(text.c_str()).x;

    ImGui::SetCursorPosX((windowWidth - textWidth) * 0.5f);
    ImGui::Text(text.c_str());

【讨论】:

【参考方案2】:

只想为多行文本添加一个解决方案,为某人节省 5 分钟。

void TextCentered(std::string text) 
    float win_width = ImGui::GetWindowSize().x;
    float text_width = ImGui::CalcTextSize(text.c_str()).x;

    // calculate the indentation that centers the text on one line, relative
    // to window left, regardless of the `ImGuiStyleVar_WindowPadding` value
    float text_indentation = (win_width - text_width) * 0.5f;

    // if text is too long to be drawn on one line, `text_indentation` can
    // become too small or even negative, so we check a minimum indentation
    float min_indentation = 20.0f;
    if (text_indentation <= min_indentation) 
        text_indentation = min_indentation;
    

    ImGui::SameLine(text_indentation);
    ImGui::PushTextWrapPos(win_width - text_indentation);
    ImGui::TextWrapped(text.c_str());
    ImGui::PopTextWrapPos();

【讨论】:

【参考方案3】:

这个comment on a similar GitHub issue 可以提供帮助,不过我自己还没有尝试过:

void TextCenter(std::string text) 
    float font_size = ImGui::GetFontSize() * text.size() / 2;
    ImGui::SameLine(
        ImGui::GetWindowSize().x / 2 -
        font_size + (font_size / 2)
    );

    ImGui::Text(text.c_str());

【讨论】:

我目前正在尝试使用新的 Table API 解决这个问题【参考方案4】:

没有 std::string 的更高效的方式

void TextCenter(const char* text, ...) 
    va_list vaList = nullptr;
    va_start(vaList, &text, );

    float font_size = ImGui::GetFontSize() * strlen(text) / 2;
    ImGui::SameLine(
        ImGui::GetWindowSize().x / 2 -
        font_size + (font_size / 2)
    );

    ImGui::TextV(text, vaList);

    va_end(vaList);

【讨论】:

以上是关于如何水平居中对齐文本?的主要内容,如果未能解决你的问题,请参考以下文章

文本对齐:居中和对齐项目:居中不水平工作

CoreText 文本水平居中对齐

excel中怎样使表格数据显示为水平居中和垂直居中?

水平居中元素文本对齐中心不起作用

将多个 div 对齐一行并将文本垂直和水平居中

excel中怎样使表格数据显示为水平居中和垂直居中?