Как я могу заставить движок поиска Android двигаться плавно?

Я пытаюсь сделать движение SeekBar более плавным, чем просто прыгать прямо на позицию. Я делаю это, так как у меня есть SeekBar с 3 вариантами для реализации ползунка.

Я ищу создать приятный гладкий слайдер с 3 вариантами "Да", "Нет опции", "Нет" для функции в моем приложении, а SeekBar выглядит наилучшим и простым способом.

Я пробовал смотреть на Android Animation, и это кажется немного сложным, поэтому, если кто-нибудь может помочь, это будет хорошо:)

Ответ 1

Построил мой собственный контроль. Работа выполнена:) Код здесь

Ответ 2

Я нашел следующее решение, чтобы сделать движение поиска плавным, но все же привязано к ограниченному диапазону значений. Предполагая, что в вашем макете есть следующие виды:

<SeekBar
  android:id="@+id/sldProgress"
  style="@style/MySliderStyle"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:max="100"
  android:progress="50" />

<TextView
  android:id="@+id/lblProgress"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="5" />

Вы можете использовать следующий код в своей деятельности (измените значение android: max в приведенном выше xml и коэффициент гладкости в приведенном ниже коде в соответствии с вашими потребностями - более высокие значения = более плавное):

public class MyActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    sliderListener sldListener = new sliderListener();
    SeekBar sldProgress = (SeekBar) findViewById(R.id.sldProgress);
    sldProgress.setOnSeekBarChangeListener(sldListener);
  }
  private class sliderListener implements OnSeekBarChangeListener {
    private int smoothnessFactor = 10;
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
      progress = Math.round(progress / smoothnessFactor);
      TextView lblProgress = (TextView) findViewById(R.id.lblProgress);
      lblProgress.setText(String.valueOf(progress));
    }

    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    public void onStopTrackingTouch(SeekBar seekBar) {
      seekBar.setProgress(Math.round((seekBar.getProgress() + (smoothnessFactor / 2)) / smoothnessFactor) * smoothnessFactor);
    }
  }
}

Ответ 3

Вам не нужно ничего строить самостоятельно, просто пользовательская анимация для Android, это сделает для вас что-то особенное.

Код написан в kotlion

    mySeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
        override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
            //Todo: code
        }

        override fun onStartTrackingTouch(seekBar: SeekBar?) {
        }

        override fun onStopTrackingTouch(seekBar: SeekBar) {
            if (seekBar.progress > 70) {
                ObjectAnimator.ofInt(seekBar, "progress", 100).setDuration(100).start()
            } else if (seekBar.progress < 30) {
                ObjectAnimator.ofInt(seekBar, "progress", 0).setDuration(100).start()
            } else {
                ObjectAnimator.ofInt(seekBar, "progress", 50).setDuration(100).start()
            }
        }
    })