Почему этот аргумент конструктора LinearGradient не работает?

Я хочу установить пользовательский объект рисования с линейным градиентом в качестве фона для панели в моем SeekBar, Я создаю LinearGradient во втором утверждении в следующем фрагменте, и делаю это так:

// Creating the drawable:
ShapeDrawable shapeDrawable = new ShapeDrawable(new RectShape());
Shader linearGradientShader = new LinearGradient(0, 0, 300, 20, new int[] { Color.RED, Color.BLUE },
new float[] { 0, 1 }, Shader.TileMode.CLAMP);
shapeDrawable.getPaint().setShader(linearGradientShader);
shapeDrawable.setBounds(10, 10, 300, 30);

seekBar.setProgressDrawable(shapeDrawable);

Проблема здесь в том, что, согласно спецификации, 6-й параметр определяется как

Может быть нулевым Относительные позиции [0..1] каждого соответствующего цвета в массиве цветов. Если это значение равно нулю, цвета распределяются равномерно по линии градиента.

Я хотел, чтобы красный и синий цвета были распределены равномерно, то есть половина формы должна выглядеть красноватой, а половина - голубоватой (как на следующем рисунке).

Так я попробовал null , new float[] {0, 0.5f} , а также new float[] {0, 1} в качестве значений 6-го аргумента. Я получил следующие три результата соответственно.

  1. За null:

  2. За new float[] {0, 0.5f}:

  3. За new float[] {0, 1}:

Покажите, где я иду не так? Как мне это исправить?

1 ответ

Решение

Использование

ShapeDrawable#setShaderFactory(фабрика ShapeDrawable.ShaderFactory)

у фабрики есть метод Shader resize(int width, int height) который вызывается каждый раз, когда изменяются ваши нарисованные границы, и это место, где вы должны вернуть свои LinearGradient шейдер на основе width / height параметры

как вы увидите, теперь вы можете просто передать NULL positions и цвета будут распределяться равномерно

Другие вопросы по тегам