5

我创建了一个带有自定义LinearGradient可绘制对象的搜索栏。但是,我希望能够更改每种颜色的渐变比例,这里我使用 3 种颜色,如果positions是,它们会均匀分布null。实际上,我想要的是为每种颜色提供宽度或比例,例如更改红色比例并将其设置为0% 到 10%seekBar width.

在这里,我想设置 0% 到 10% 红色、10% - 80% 黄色和 80% 到 100% 红色,并且能够动态更改每种颜色的宽度值。

这可能吗,如果可以,有人可以指导我如何做吗?

我的代码

private ShapeDrawable getSeekBarGradientDrawable(int mRectWidth, int mRectHeight) {
    int[] colors = new int[] { Color.RED, Color.YELLOW, getResources().getColor(R.color.primaryButton, null)};

DisplayMetrics displayMetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels - (int) getResources().getDimension(R.dimen.margin_padding_size_medium);

    Shader shader = new LinearGradient(
            0,
            0,
            width,
            mRectHeight,
            colors, new float[] {0.1f,0.7f,0.2f},
            Shader.TileMode.CLAMP);

    ShapeDrawable shape = new ShapeDrawable(new RectShape());
    shape.getPaint().setShader(shader);
    return shape;
}

图像可以从当前设置中看到,它与我描述的不同。

在此处输入图像描述

4

1 回答 1

2

这个答案适用于使用LinearGradient作为Shader

通过如下设置数组,将LinearGradient颜色更改为从一种颜色过渡到相同颜色:colors

int[] colors = new int[]{Color.RED, Color.RED, Color.YELLOW, Color.YELLOW, Color.GREEN, Color.GREEN};

更改LinearGradient以定义颜色区域,如下所示:请参阅具有位置的 LinearGradient

Shader shader = new LinearGradient(  
    0,  
    0,  
    width,  
    mRectHeight,  
    colors, new float[]{0f, 0.1f, 0.1f, 0.8f, 0.8f, 1.0f},  
    Shader.TileMode.CLAMP);

这会强制着色器在创建纯色的区域上从一种颜色过渡到相同颜色。

在此处输入图像描述

以上将给出从一种颜色到另一种颜色的即时过渡。如果您想要一个窄过渡(比LinearGradient的默认值窄),您可以按如下方式操作颜色和位置数组。在下文中,我们将过渡从红色更改为黄色。

int[] colors = new int[]{Color.RED, Color.RED, Color.YELLOW, Color.YELLOW, Color.YELLOW, Color.GREEN, Color.GREEN};
Shader shader = new LinearGradient(
        0,
        0,
        width,
        mRectHeight,
        colors, new float[]{0f, 0.1f, 0.15f, 0.15f, 0.8f, 0.8f, 1.0f},
        Shader.TileMode.CLAMP);

在此处输入图像描述

于 2020-10-20T12:15:50.457 回答