У меня первичный и вторичный прогресс растут одновременно, вторичный прогресс растет быстрее, чем первичный. Каждый раз, когда я обновляю первичный прогресс, вторичный теряется (как будто он равен нулю или меньше, чем первичный). Это вызывает неприятное мерцание.
Единственный обходной путь, который я нашел, - установить вторичный файл на себя после установки основного. Я добавил «+1», так как SeekBar имеет проверку и не перерисовывается, если я устанавливаю то же значение.
mSeekBar.setProgress(newPosition);
mSeekBar.setSecondaryProgress(mSeekBar.getSecondaryProgress()+1); // WTF?
Вторая строка может исправить это, но это выглядит нелепо и, я думаю, тоже неэффективно.
Это происходит на Lollipop (5.0.1) - API 21. Раньше все работало нормально - не могу понять, почему.
Если я строю для уровня API 19, он работает нормально. (видео: API19Seekbar)
targetSdkVersion 19
compile 'com.android.support:appcompat-v7:19.+'
Если я строю для уровня API 21, он мерцает. (видео: API21SeekBar)
targetSdkVersion 21
compile 'com.android.support:appcompat-v7:21.+'
Ниже приведен полный пример кода действия:
int delay1 = 1000;
int delay2 = 200;
int primaryProgress;
int secondaryProgress;
boolean mStarted;
Button mButton;
SeekBar mSeekBar;
Handler h1 = new Handler();
Handler h2 = new Handler();
Runnable primary = new Runnable() {
@Override
public void run() {
primaryProgress = (primaryProgress + 1) % 100;
mSeekBar.setProgress(primaryProgress);
h1.postDelayed(primary, delay1);
}
};
Runnable secondary = new Runnable() {
@Override
public void run() {
secondaryProgress = (secondaryProgress + 1) % 100;
mSeekBar.setSecondaryProgress(secondaryProgress);
h2.postDelayed(secondary, delay2);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonClick();
}
});
mSeekBar = (SeekBar)findViewById(R.id.seekBar);
}
private void buttonClick() {
mStarted = !mStarted;
if (mStarted) {
mButton.setText("Started");
h1.postDelayed(primary, delay1);
h2.postDelayed(secondary, delay2);
} else {
mButton.setText("Stopped");
h1.removeCallbacks(primary);
h2.removeCallbacks(secondary);
}
}
SeekBar
по умолчаниюprogressDrawable
имеет<selector>
в качестве корня, но корень должен быть<layer-list>
. Лучшим способом, вероятно, было бы скопироватьscrubber_progress_horizontal_material.xml
и его 9-патч PNG из ресурсов SDK, а затем переставить теги так, чтобы<layer-list>
был в корне. Если вам не нужно отключенное состояние, это так же просто, как удалить внешний элемент и дополнительный элемент отключенного состояния. - person alanv   schedule 05.02.2015