2012-03-13 49 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() 
      } 
     } 
    })