如何获取宽度以正确设置 LinearGradient

发布于 2024-12-22 21:00:41 字数 956 浏览 3 评论 0原文

我正在从 SeekBar 创建一个颜色选择器。到目前为止,我已经成功地替换了 onCreate() 中的进度可绘制对象,如下所示:

    SeekBar colorChooser = (SeekBar) findViewById(R.id.seekBarColorChooser);

    LinearGradient rainbow = new LinearGradient(0f, 0f, 100f, 0f,
            new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
                                    0xFF00FFFF, 0xFF0000FF,
                                    0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP);

    RoundRectShape roundedRect = new RoundRectShape(new float [] {10f, 10f, 10f, 10f, 10f, 10f, 10f, 10f} , null, null);

    ShapeDrawable shape = new ShapeDrawable(roundedRect);
    shape.getPaint().setShader(rainbow);

    colorChooser.setProgressDrawable((Drawable) shape);

这完美地工作了!结果正是我想要的,但是,我关心的一件事是 LinearGradient 中的硬编码宽度 (100f)。

由于该对话框尚未实现,因此 SeekBar 或 Dialog 似乎都没有任何宽度。换句话说,colorChooser.getWidth() 返回 0。

如果宽度太小,则渐变会压缩在左侧。如果太大,则只会出现一部分渐变。如何获得良好的宽度值来设置线性渐变以正确显示?

谢谢你!

I am creating a color chooser from a SeekBar. So far, I have successfully replaced the progress drawable in onCreate() as follows:

    SeekBar colorChooser = (SeekBar) findViewById(R.id.seekBarColorChooser);

    LinearGradient rainbow = new LinearGradient(0f, 0f, 100f, 0f,
            new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
                                    0xFF00FFFF, 0xFF0000FF,
                                    0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP);

    RoundRectShape roundedRect = new RoundRectShape(new float [] {10f, 10f, 10f, 10f, 10f, 10f, 10f, 10f} , null, null);

    ShapeDrawable shape = new ShapeDrawable(roundedRect);
    shape.getPaint().setShader(rainbow);

    colorChooser.setProgressDrawable((Drawable) shape);

This works perfectly! The result is exactly what I am looking for, however, the one thing that concerns me is the hard coded width (100f) in the LinearGradient.

Since this dialog is not yet realized, neither the SeekBar or the Dialog seem to have any width. In other words, colorChooser.getWidth() returns 0.

If width is too small, the gradient is compacted on the left side. If it is too large, only a part of the gradient appears. How do I get a good width value to setup the linear gradient to display properly?

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

递刀给你 2024-12-29 21:00:41

您可以向资源添加维度,其中,当然,对于不同的屏幕可以有不同的值 - 如果您没有定义特定的 dpi(例如),它也会适当缩放。

You could add a dimension to your resources, which, of course, can have different values for different screens - it will also scale appropriately if you don't have a specific dpi defined (for instance).

静谧幽蓝 2024-12-29 21:00:41

替换

LinearGradient rainbow = new LinearGradient(0f, 0f, 100f, 0f,
        new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
                                0xFF00FFFF, 0xFF0000FF,
                                0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP); 

LinearGradient rainbow = new LinearGradient(0f, 0f, 500f, 0f,
        new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
                                0xFF00FFFF, 0xFF0000FF,
                                0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP); 

Replace

LinearGradient rainbow = new LinearGradient(0f, 0f, 100f, 0f,
        new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
                                0xFF00FFFF, 0xFF0000FF,
                                0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP); 

with

LinearGradient rainbow = new LinearGradient(0f, 0f, 500f, 0f,
        new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
                                0xFF00FFFF, 0xFF0000FF,
                                0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文