Горизонтальный индикатор прогресса: переключение между определенным и неопределенным - PullRequest
7 голосов
/ 01 июля 2011

Я пытаюсь переключить 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), кажется, что ничьи не меняются должным образом.В случае неопределенного-> детерминированного анимация останавливается, а из детерминированного-> неопределенного ничего не происходит.

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

Ответы [ 4 ]

2 голосов
/ 20 июля 2011

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

// Configure the SeekBar
seekBar.setIndeterminate(true);
seekBar.postInvalidate();
1 голос
/ 10 июля 2011

SeekBar onSizeChanged () инициализирует только текущий выбранный фон для рисования и вызывается один раз при инициализации 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 ...

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

0 голосов
/ 31 августа 2012

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

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

progressBar.setIndeterminate(true);

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

this.progressBar.post(new Runnable()
{
    @Override
    public void run()
    {
        progressBar.setIndeterminate(true);
    }
});
0 голосов
/ 01 июля 2011

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

...