2012-03-13 13 views
10

Staram się, aby ruch SeekBar był bardziej płynny, niż tylko przeskakiwanie prosto na pozycję. Robię to, ponieważ mam SeekBar z 3 opcjami do implementacji typu slider.Jak sprawić, aby pasek wyszukiwania Androida poruszał się płynnie?

Szukam stworzyć ładny gładki suwak z 3 opcjami "Tak", "Bez opcji", "Nie" dla funkcji w mojej aplikacji i SeekBar wygląda najlepiej i najłatwiej.

Próbowałem patrząc na animacji Android i wydaje się nieco skomplikowane tad, więc jeśli ktoś może mieć żadnej pomocy, że byłoby miło :)

Odpowiedz

5

Wbudowany własną kontrolę. Zadanie zostało wykonane :) Kod here

+1

+1 Możesz dodać kod źródłowy, aby pomóc odwiedzającym w przyszłości. –

+0

Będę, opublikuję go, jak tylko wypchnę ostatnią wersję mojej aplikacji. Myślę, że open source aplikacji i tak –

+3

Zgodnie z obietnicą - https://github.com/kennydude/Speaker/blob/master/src/me/kennydude/speaker/SmoothSeekBar.java ta lokalizacja zostanie zaktualizowana jako aktualizacje kodu –

11

Znalazłem następujące rozwiązanie, aby pasek wyszukiwania poruszał się płynnie, ale nadal przyciągał do ograniczonego zakresu wartości. Zakładając, że masz następujące widoki w układzie:

<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" /> 

Można użyć następującego kodu w swojej działalności (zmiana wartości android: max w powyższym XML, a współczynnik gładkości w kodzie poniżej według Państwa potrzeby - wyższe wartości = gładsze):

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); 
    } 
    } 
} 
+4

Ktokolwiek to zarzucił, proszę wyjaśnić, co jest nie tak z odpowiedzią - pamiętaj, że zrzeczenie się jest przeznaczone tylko w skrajnych przypadkach, w których nie podjęto żadnego wysiłku, lub odpowiedź jest niebezpieczna. Jeśli odpowiedź jest niebezpieczna, chciałbym wiedzieć, dlaczego! Dziękuję Ci. – Russ

+0

Integer.parseInt (String.valueOf (Math.round (progress/smoothnessFactor))); To nie wydaje się właściwe. progress/smoothnessFactor zawsze będzie generował int, więc nie trzeba go zaokrąglać, a następnie przekształcasz go na ciąg, a następnie z powrotem do int. – theelfismike

+4

Czy to wszystko? Nie zamierzasz wysadzić swojej aplikacji? Zmodyfikowałem kod, aby usunąć niepotrzebne konwersje (ktoś mógł to zrobić - nie trzeba głosować). – Russ

1

nie trzeba zbudować coś samemu tylko użytkownika android animacja będzie zrobić coś dla ciebie

Kod napisany w 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() 
      } 
     } 
    }) 
Powiązane problemy