代码之家  ›  专栏  ›  技术社区  ›  AlanChien

使用动态多色和角查看背景[关闭]

  •  -1
  • AlanChien  · 技术社区  · 8 年前

    我试图创建一个带有动态百分比标记的视图,以设置视图和角点的不同颜色(如图所示)。

    enter image description here

    如果只设置多色很容易做到这一点,只需计算视图宽度的百分比并设置颜色即可完成。但我不知道如何在角落里做到这一点。

    谢谢。

    编辑

    我使用ShapeDrawable解决方案,结果如下。

    我的问题是:为什么分裂线是倾斜的?

    enter image description here

    更新

    有成功的结果,但这不是我想要的。。

    enter image description here

    我希望我能得到如下清晰的划分:

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  0
  •   R. Zagórski Krishnraj Anadkat    8 年前

    我想我达到了你的期望。不幸的是,这样的drawable不能作为.xml,但可以在代码中完成。以下是模板:

    ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() {
        @Override
        public Shader resize(int width, int height) {
            LinearGradient lg = new LinearGradient(0, 0, width, 0,
                        new int[]{
                                ContextCompat.getColor(getContext(), android.R.color.holo_green_light),
                                ContextCompat.getColor(getContext(), android.R.color.holo_green_light),
                                ContextCompat.getColor(getContext(), android.R.color.holo_orange_light),
                                ContextCompat.getColor(getContext(), android.R.color.holo_orange_light),
                                ContextCompat.getColor(getContext(), android.R.color.holo_red_light),
                                ContextCompat.getColor(getContext(), android.R.color.holo_red_light),
                                ContextCompat.getColor(getContext(), android.R.color.holo_purple),
                                ContextCompat.getColor(getContext(), android.R.color.holo_purple)},
                        new float[]{0, 0.60f, 0.60f, 0.80f, 0.80f, 0.85f, 0.85f, 1}, Shader.TileMode.REPEAT);
                return lg;
        }
    };
    PaintDrawable p = new PaintDrawable();
    p.setShape(new RectShape());
    p.setCornerRadius(40);
    p.setShaderFactory(sf);
    

    看看上面的几个细节。创建LinearGradient时,必须传递一组颜色及其在渐变中的位置。为了实现 very long 绿色:您必须将绿色加倍,并通过位置 0 0.96f 。然后添加 orange 颜色是一次性的。是卡弗鲁尔,这之间的不同 green 紫色必须非常低(但必须有空间 橙色 颜色)。

    p.setCornerRadius(40);