Одушевленный прогресс - PullRequest
11 голосов
/ 05 июня 2011

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

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

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

enter image description here

Ответы [ 6 ]

13 голосов
/ 13 июня 2013

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

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

Я сделал это, используя ObjectAnimator.

private void animateProgression(int progress) {
    final ObjectAnimator animation = ObjectAnimator.ofInt(mySeekBar, "progress", 0, progress);
    animation.setDuration(3000);
    animation.setInterpolator(new DecelerateInterpolator());
    animation.start();
    mySeekBar.clearAnimation();
}
0 голосов
/ 12 мая 2017

Мне нужен был код, похожий на то, что сделал @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();
    }
0 голосов
/ 05 июня 2011

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

0 голосов
/ 05 июня 2011

Если вы используете Honeycomb, то вы можете использовать ViewPropertyAnimator http://android -developers.blogspot.com / 2011/05 / inturing-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 фактически не перемещает представление.Это просто создает иллюзию того, что представление изменилось.Важное отличие, если вы все еще хотите, чтобы панель поиска продолжала получать касания. </p>

...