Ответ 1
Я сократил количество итераций, итерации задачи таймера по экспоненциальной функции вместо единиц. Все еще надеются на лучшие ответы: -)
У меня есть экран с 4 барами поиска (как показано на рисунке ниже). Если пользователь перемещает B, C или D, я вычисляю среднее значение трех и setProgress of A в среднем. Это была легкая часть. То, что я хотел бы сделать, - это оживить индикатор выполнения A, чтобы он не прыгал одним выстрелом (например, с 25-75).
Каковы рекомендуемые способы анимации A? Я получил простую анимацию, но я вызываю TimerTask каждые 50 мс для увеличения или уменьшения A на единицу измерения до достижения требуемой позиции. Но это не очень эффективно.
Примечание. У меня есть пользовательский объект Seekbar, с помощью которого я создал seekBar A, B, C и D. Извините, я не могу действительно поделиться кодом, но буду рад прояснить что-либо.
Я сократил количество итераций, итерации задачи таймера по экспоненциальной функции вместо единиц. Все еще надеются на лучшие ответы: -)
Я думаю, что слишком поздно. Но я нашел способ добиться этого с помощью ValueAnimator.
ValueAnimator anim = ValueAnimator.ofInt(0, seekBar.getMax());
anim.setDuration(1000);
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int animProgress = (Integer) animation.getAnimatedValue();
seekBar.setProgress(animProgress);
}
});
anim.start();
Это работает на любой версии Android без использования анимации.
private void animateSeek(final SeekBar mSeek, final int toVal) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (mSeek.getProgress() == toVal) {
break;
}
int mProgress = mSeek.getProgress();
if (mProgress < toVal) {
mProgress++;
} else if (mProgress > toVal) {
mProgress--;
}
mSeek.setProgress(mProgress);
try {
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
Если вы используете Honeycomb, вы можете использовать ViewPropertyAnimator http://android-developers.blogspot.com/2011/05/introducing-viewpropertyanimator.html
Анимация до 3.0 довольно ограничена, но в качестве альтернативы вашему методу вы можете использовать прослушиватель анимации:
anim.setAnimationListener(new AnimationListener() {
public void onAnimationStart(Animation anim) {
//moveseekbar
}
public void onAnimationRepeat(Animation anim) {}
public void onAnimationEnd(Animation anim) {
//call animation again if movement not complete
}
});
Не забудьте вызвать setFillAfter (boolean fillAfter) потому что анимация < 3.0 фактически не перемещает представление. Это просто иллюзия, что взгляд переместился. Важное различие, если вы все еще хотите, чтобы стрелка продолжала получать штрихи.
Мне нужен код, похожий на то, что сделал @sidhanshu_udawat. Это была отличная база для начала. Большая победа, потому что она работает по собственной теме. Спасибо за этот пример.
Однако, когда я взял этот код и попробовал его, возникла проблема, что он будет увеличиваться, а затем останавливаться.
Я изменил код (вставляемый ниже), и теперь, если вы отправите свой поисковый барабан с кодом, как показано ниже, вы увидите, что поисковая система анимирует вверх и вниз по шкале.
isRunning - управление с вашей стороны
Кроме того, мне нужно было остановить анимацию, когда кто-то нажал кнопку, поэтому я добавил логическое isRunning как член моей активности. Теперь, когда они нажимают кнопку, я устанавливаю isRunnig в false и SeekBar останавливается.
Настройте свой SeekBar следующим образом, а затем вызовите метод:
animSeekBar.incrementProgressBy(1);
animSeekBar.setMax(100);
animateSeek(animSeekBar,100);
private void animateSeek(final SeekBar mSeek, final int toVal) {
new Thread(new Runnable() {
@Override
public void run() {
boolean isIncrementing = true;
int mProgress = 0;
isRunning = true;
while (isRunning) {
if (isIncrementing){
mProgress++;
}
else{
mProgress--;
}
mSeek.setProgress(mProgress);
if (mProgress >= toVal) {
isIncrementing = false;
} else if (mProgress <= 0) {
isIncrementing = true;
}
try {
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}