2012-03-13 34 views
10

我試圖使SeekBar移動比直接跳到位置更順利。我這樣做是因爲我有一個帶有3個選項的SeekBar,用於滑塊類型的實現。我該如何讓Android搜索欄順利移動?

我希望創建一個不錯的流暢滑蓋3選擇「是」,「否選項」,「否」爲我的應用程序功能和搜索欄看起來最好,最簡單的方法。

我試着看的Android動畫,似乎稍微有點複雜,因此,如果任何人都可以有所幫助的話,這將是不錯的:)

回答

5

建立了自己的控制。完成任務:)代碼here

+1

+1您可以添加的源代碼,這樣你將有助於在未來的訪客。 – 2012-03-15 22:07:03

+0

我會盡快推送最新版本的應用程序。我認爲應用程序的開源反正 – 2012-03-16 08:58:05

+3

作爲承諾 - https://github.com/kennydude/Speaker/blob/master/src/me/kennydude/speaker/SmoothSeekBar.java該位置將 – 2012-03-19 14:52:17

11

我發現下面的解決方案,使搜索條平滑移動,但仍然捕捉到的值的範圍有限。假設你已經在你的佈局如下觀點:

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

誰低估了這一點,請解釋一下答案的錯誤 - 請記住,downvoting只用於極度的情況下,如果答案沒有付出努力或答案是危險的。如果答案很危險,我想知道爲什麼!謝謝。 – Russ 2012-09-10 13:02:44

+0

Integer.parseInt(String.valueOf(Math.round(progress/smoothnessFactor)));這看起來不正確。 progress/smoothnessFactor總是會產生一個int,所以不需要四捨五入,然後將它轉換爲一個字符串,然後返回到int。 – theelfismike 2013-05-03 20:43:28

+4

就是這樣嗎?幾乎不打算你的應用程序是它?我編輯了代碼以刪除這些不必要的轉換(任何人都可以這樣做 - 無需投票)。 – Russ 2013-05-05 07:13:31

1

你並不需要自己構建任何東西只是用戶的Android動畫它會做的事情,你

在kotlion

writen代碼
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() 
      } 
     } 
    })