【问题标题】:Create a nice Codename One slider to notify a percentage创建一个漂亮的 Codename One 滑块以通知百分比
【发布时间】:2018-10-21 03:34:49
【问题描述】:

读者注意:这个问题是针对代号一的,它不是关于 css、html 或类似的。

我的用例是通知用户他/她的个人资料完成了多少。 我需要实现一个像下面这样的滑块,但是在使用Slider component 进行了大量试验之后,我不明白如何实现它。 (老实说,我什至不明白如何开始实现它,也不知道 Slider 组件是否合适。)

此滑块的宽度应等于父窗体的 contentPane。基本上它是一个带有小边框的矩形:根据百分比,矩形的一部分是彩色的,另一部分是白色的。在矩形上,我需要百分比和文本:百分比和文本位于固定位置。文本的颜色会根据背景颜色而变化,如第二张图片所示。

感谢您的帮助。

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    这很容易,除了颜色变化。该部分需要对图形进行手工编码。我没有运行这段代码,但它应该非常接近它的工作方式:

    class ProgressSlider extends Component {
        protected Dimension calcPreferredSize() {
            return new Dimension(convert(getDisplayWidth(), 6));
        }
    
        public void paint(Graphics g) {
             g.setColor(0xffffff);
             g.fillRect(getX(), getY(), getWidth(), getHeight());
             g.setColor(0);
             Font f = getStyle().getFont();
             g.drawString(progressPercetage, convert(4) + getX(), getY() + f.getHeight() / 2 + getHeight() - 2);
             g.drawString(progressText, convert(10) + getX(), getY() + f.getHeight() / 2 + getHeight() - 2);
             g.setColor(RED);
             g.fillRect(getX(), getY(), getWidth() / 100 * progressPercentage, getHeight());
             g.setColor(0xcccccc);
             g.drawRect(getX(), getY(), getWidth() - 1, getHeight() - 1);
             g.clipRect(getX(), getY(), getWidth() / 100 * progressPercentage, getHeight());
             g.setColor(0xffffff);             
             g.drawString(progressPercetage, convert(4) + getX(), getY() + f.getHeight() / 2 + getHeight() - 2);
             g.drawString(progressText, convert(10) + getX(), getY() + f.getHeight() / 2 + getHeight() - 2);
        }
    }
    

    这可能缺少一些细节,例如重置剪辑区域等。我没有运行它,但如果调整正确,它应该会产生几乎相同的结果。文本被绘制了两次(第二次剪切)以复制颜色变化的效果。

    【讨论】:

    • 你给了我正确的方向!!!非常感谢!对于读者,我评论了您的代码并插入了一些修复以使其完美运行:gist.github.com/jsfan3/4fe7e3679bbca4d1875f2c4ccfb9e7eb
    • 是否有关于这些硬编码图形函数的文档? API 的文档很少,例如我不理解 API 中的g.clipRect,即使我可以通过这段代码猜到它是如何工作的。
    • 开发者指南中有图形部分。它基于 Java 的 AWT/Swing 图形约定建模,因此大多数开发人员应该非常熟悉。在内部,所有 Codename One 组件均基于此 API 构建
    • 我已经完成了第一次快速阅读:codenameone.com/manual/graphics.html 这似乎很难学习(因为我从未使用过这个级别的图形),但是它允许通常无法使用标准组件。它在特殊用例中非常有用。
    • 按照惯例,您应该将图形对象返回到与您获得它的状态相似的状态。这并不总是必不可少的,但有时代码可能会无意中依赖它,您最终可能会遇到一个奇怪的错误仅在某些条件和某些平台上发生。您可以使用setClip() 而不是resetAffine,它适用于仿射变换。对于大多数用例,您不需要接触仿射变换,因此也不需要 resetAffine。一个较新的技巧是使用pushClip() 然后popClip() 当你完成时,我还没有养成使用它的习惯;-)
    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多