SeekBar: ProgressDrawable отображается только после первого прогресса - PullRequest
1 голос
/ 17 января 2012

Я хочу реализовать простой инструмент выбора цвета hsv, который хорошо вписывается в мое приложение. Как известные средства выбора цвета формы, я хотел бы изменить фон seekBars в соответствии со значением других seekBars.

Но когда я начинаю занятие, я вижу это:

enter image description here

После первого прикосновения к одному из seekBars (независимо от того, какой) я получаю этот результат, и после первого касания раскладка остается такой же и не изменяется при дальнейших касаниях (что также было бы ожидаемым согласно моим компоновка, 2 полосы поиска сверху 20dip, а 1 ниже, как большой палец):

enter image description here

Как видно на втором рисунке, я хотел бы получить seekBar с самого начала.

Вот мой макет:

<SeekBar
    android:id="@+id/SbColorPickerHue"
    android:layout_width="match_parent"
    android:layout_height="20dip"
    android:max="360"
    android:thumb="@drawable/colorpickerthumb" />
<SeekBar
    android:id="@+id/SbColorPickerSaturation"
    android:layout_width="match_parent"
    android:layout_height="20dip"
    android:max="255" 
    android:thumb="@drawable/colorpickerthumb"/>
<SeekBar
    android:id="@+id/SbColorPickerValue"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:max="255" 
    android:thumb="@drawable/colorpickerthumb"/>

С OnSeekBarChangeListener в onProgressChanged () и, конечно, в onCreate (чтобы инициализировать seekBars), я вызываю следующую функцию (чтобы обезопасить вас от большого количества кода, отображается только градиент оттенка):

    private void setGradients() {
        mHueGradient = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,mColors);
        mHueGradient.setGradientType(GradientDrawable.LINEAR_GRADIENT);
        mHueGradient.setCornerRadius(mRadius);
        mHueGradient.setStroke(mStrokeWidth, mStrokeColor);
        mSbHue.setBackgroundDrawable(mHueGradient);
    }

Я уже пробовал много разных вещей:

  • установить градиенты дважды в onCreate
  • снова установить градиенты в onRescume
  • как видно из макета xml, я установил некоторые из SeekBar на фиксированную высоту (20dp), а другие - wrap_content. Поведение немного изменилось (как видно на фотографиях). Но все равно не удовлетворяет.
  • Недействительно либо seekBar, либо Drawable
  • Force Layout
  • Мера рисования

Результат всегда один и тот же.

Что я здесь не так делаю? Я что-то упустил?

Редактировать 1:

SeekBar и ChangeListener определены следующим образом:

    mSbHue = (SeekBar)findViewById(R.id.SbColorPickerHue);
    setGradients();
    mSbHue.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        public void onStopTrackingTouch(SeekBar seekBar) {
        }

        public void onStartTrackingTouch(SeekBar seekBar) {
        }

        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            setGradients();
        }
    });

1 Ответ

1 голос
/ 26 января 2012

Если вы перемещаете setGradients () после слушателя, он работает.

mSbHue = (SeekBar)findViewById(R.id.SbColorPickerHue);
mSbHue.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    public void onStopTrackingTouch(SeekBar seekBar) {
    }

    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        setGradients();
    }
});
setGradients();
...