Горизонтальный ProgressBar: переключение между детерминированным и неопределенным

Я пытаюсь скрыть SeekBar между двумя режимами отображения состояния потокового мультимедиа.

Я установил, что правильная графика показывает при определении android:indeterminate тег в XML:

<SeekBar
    android:id="@+id/seekBar1"
    android:indeterminate="false"
    android:progressDrawable="@android:drawable/progress_horizontal"
    android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"
    android:indeterminateBehavior="cycle"
    android:indeterminateOnly="false"
    android:progress="33"
    android:secondaryProgress="66"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"></SeekBar>

example

проблема в том, что при попытке переключиться, вызвав setIndeterminate(true), drawables, похоже, не меняются должным образом. В случае indeterminate->determinate анимация останавливается, а из determinate - >indeterminate ничего происходит.

что я делаю не так?

4 ответов


SeekBar onSizeChanged () инициализирует только текущий выбранный фон drawable, и он вызывается один раз, когда SeekBar инициализируется. Таким образом, исправление может быть:

public class CorrectedSeekBar extends SeekBar {

    public CorrectedSeekBar(Context context) {
         super(context);
    }

    public CorrectedSeekBar(Context context, AttributeSet attrs) {
         super(context, attrs);
    }

    public CorrectedSeekBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        boolean current = isIndeterminate();
        setIndeterminate(!current);
        super.onSizeChanged(w, h, oldw, oldh);
        setIndeterminate(current);
        super.onSizeChanged(w, h, oldw, oldh);
    }

}

и в макете xml используйте <yourpackage.CorrectedSeekBar ...

это не выглядит хорошо, другие обходные пути могут быть возможны, но я думаю, что это основная проблема (ошибка?).


У меня была та же проблема, и я решил ее, вызвав postInvalidate (), чтобы принудительно обновить представление. Я на Android 2.3.4.

// Configure the SeekBar
seekBar.setIndeterminate(true);
seekBar.postInvalidate();

Ну, вместо того, чтобы устанавливать pd на неопределенный, просто переключите его фон. если вы хотите рисовать анимации, то я предлагаю посмотреть в TransitionDrawable здесь:TransitionDrawable. таким образом, его использование заключается в том, чтобы добавить 2 разных drawables и оживить их переход. я думаю, это должно сработать для вашего дела. но у меня нет опыта делать что-то подобное в диалоге прогресса, поэтому я не могу сказать.


решение на самом деле очень просто, тот же трюк, который вы должны использовать, чтобы начать анимированный drawable. Эта проблема затрагивает только Android 2.3 (возможно, также более старые версии Android).

всякий раз, когда вы хотите установить:

progressBar.setIndeterminate(true);

вместо этого используйте эту часть кода:

this.progressBar.post(new Runnable()
{
    @Override
    public void run()
    {
        progressBar.setIndeterminate(true);
    }
});