Анимация прокрутки

У меня есть экран с 4 барами поиска (как показано на рисунке ниже). Если пользователь перемещает B, C или D, я вычисляю среднее значение трех и setProgress of A в среднем. Это была легкая часть. То, что я хотел бы сделать, - это оживить индикатор выполнения A, чтобы он не прыгал одним выстрелом (например, с 25-75).

Каковы рекомендуемые способы анимации A? Я получил простую анимацию, но я вызываю TimerTask каждые 50 мс для увеличения или уменьшения A на единицу измерения до достижения требуемой позиции. Но это не очень эффективно.

Примечание. У меня есть пользовательский объект Seekbar, с помощью которого я создал seekBar A, B, C и D. Извините, я не могу действительно поделиться кодом, но буду рад прояснить что-либо.

enter image description here

Ответ 1

Я сократил количество итераций, итерации задачи таймера по экспоненциальной функции вместо единиц. Все еще надеются на лучшие ответы: -)

Ответ 2

Я думаю, что слишком поздно. Но я нашел способ добиться этого с помощью 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();

Ответ 3

Это работает на любой версии 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();
}

Ответ 4

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

Ответ 5

Мне нужен код, похожий на то, что сделал @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();
    }