2012-03-13 7 views
10

Bir SeekBar'ı düz bir şekilde yere atlamaktan daha yumuşak bir şekilde hareket ettirmeye çalışıyorum. Kaydırıcı tipi bir uygulama için 3 seçenek ile bir SeekBar var gibi bunu yapıyorum.Android arama çubuğunu nasıl sorunsuz bir şekilde kullanabilirim?

Uygulamamdaki bir özellik için 3 seçenek olan "Evet", "Hayır seçenek", "Hayır" ile güzel ve düzgün bir kaydırıcı oluşturmak istiyorum ve bir SeekBar en iyi ve en kolay şekilde görünüyor.

Ben Android Animasyon bakarak denedim ve herkes :)

cevap

5

kendi kontrolü Dahili güzel olurdu herhangi bir yardım olabilir, eğer bu yüzden, biraz biraz karmaşık görünüyor. İş bitti :) Kod here

+1

+1 Gelecekte ziyaretçilere yardımcı olacak şekilde kaynak kodu ekleyebilirsiniz. –

+0

Yapacağım, başvurumun en son sürümünü indirir yüklemez yayınlayacağım. Ben zaten uygulamanın açık kaynak olduğunu düşünüyorum –

+3

Söz verdiği gibi - https://github.com/kennydude/Speaker/blob/master/src/me/kennydude/speaker/SmoothSeekBar.java bu konum kod güncellemeleri –

11

Arama çubuğunun sorunsuz bir şekilde hareket etmesini sağlamak için aşağıdaki çözümü buldum, ancak yine de sınırlı bir değerler aralığına erişiyorum.

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

Sen (aktivitesinde aşağıdaki kodu kullanabilirsiniz android değerini değiştirebilirsiniz: Eğer düzeninde aşağıdaki görüşlere sahip varsayarsak göre aşağıdaki kodu yukarıdaki xml max ve pürüzsüzlük faktörü senin ihtiyaçlar - yüksek değerler = yumuşak):

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

Bunu reddeden, lütfen cevabın neyin yanlış olduğunu açıkla - hatırla, küçültme, yalnızca cevaba hiç çaba sarf etmediği veya cevabın tehlikeli olduğu aşırı durumlarda kullanılır. Cevabınız tehlikeli ise nedenini bilmek isterim! Teşekkür ederim. – Russ

+0

Integer.parseInt (String.valueOf (Math.round (progress/smoothnessFactor))); Bu doğru görünmüyor. progress/smoothnessFactor her zaman bir int verir, bu yüzden onu yuvarlamaya gerek yoktur, o zaman onu bir dizgeye dönüştürürsünüz ve sonra bir int'ye dönüşürsünüz. – theelfismike

+4

Hepsi bu kadar mı? Uygulamanı havaya uçuracak mısın? Bu gereksiz dönüşümleri kaldırmak için kodu düzenledim (herkes bunu yapabilirdi - oy kullanmaya gerek yoktu). – Russ

1

bunu için bir şey yapacak başınıza sadece kullanıcı android animasyon şey inşa etmek gerekmez sen

kotlion

manzum kod
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() 
      } 
     } 
    })