【问题标题】:Changing step values in seekbar?在搜索栏中更改步长值?
【发布时间】:2011-09-07 05:19:25
【问题描述】:

我有一个搜索栏,在移动它时我想将值从 0 更改为 200。我有一个 TextView,在移动搜索栏时我会在其中显示这些值。但我不想拥有该区间的每个值(0,1,2,3,4,5...),而是拥有 10、20、30...等等。所以当我移动搜索栏时,我想显示 10,20,30,40.... 到 200。有人可以给我一个提示或示例如何做到这一点吗?

【问题讨论】:

标签: android android-seekbar android-slider


【解决方案1】:

试试下面的代码

SeekBar seekBar = (SeekBar)layout.findViewById(R.id.seekbar);
seekBar.setProgress(0);
seekBar.incrementProgressBy(10);
seekBar.setMax(200);
TextView seekBarValue = (TextView)layout.findViewById(R.id.seekbarvalue);
seekBarValue.setText(tvRadius.getText().toString().trim());

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        progress = progress / 10;
        progress = progress * 10;
        seekBarValue.setText(String.valueOf(progress));
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

setProgress(int)用于设置搜索栏的起始值

setMax(int)用于设置搜索栏的最大值

如果你想设置搜索栏的边界,那么你可以在onProgressChanged 方法中检查进度条的值。如果进度小于或大于边界,则可以将进度设置为您定义的边界。

【讨论】:

  • 哇,这只是一个很好的例子!无论如何,我可以将搜索栏的最小值设置为 10 吗?我可以通过说“seekBar.setMax(200)”来设置最大值,没有最小值。我对如何做到这一点有一些想法,但每次都会出错(
  • 使用 seekBar.setProgress(10);在搜索栏中将最小值设置为 10
  • 我解决了这个问题。你看,当我刚刚将进度设置为 10 时,我仍然可以设置 0,我想禁用此选项(因此用户不能选择小于 10 的值)。我这样做了,但在 ChangeListener 中添加了一个“if”语句。
  • 进行进度=进度/10的逻辑是什么;进度 = 进度 * 10;这在 onProgressChanged 中?如果你将某个东西除以一个常数,然后再乘以相同的常数,它不会是初始值吗?
  • 这里是progress = progress / 10背后的逻辑;进度 = 进度 * 10; E/onProgressChanged::progress = 19 E/onProgressChanged::progress / 10 = 1 E/onProgressChanged::progress * 10 = 10 E/onProgressChanged::progress = 10 E/onProgressChanged::progress / 10 = 1 E/onProgressChanged: : 进度 * 10 = 10 E/onProgressChanged:: 进度 = 20 E/onProgressChanged:: 进度 / 10 = 2 E/onProgressChanged:: 进度 * 10 = 20 E/onProgressChanged:: 进度 = 21 E/onProgressChanged:: 进度 / 10 = 2 E/onProgressChanged:: 进度 * 10 = 20 E/onProgressChanged:: 进度 = 20
【解决方案2】:

我能想到的最简单的方法就是定义:

SeekBar yourSeekBar = (SeekBar)findViewById(R.id.yourSeekBarId);
yourSeekbar.setMax(20);

接下来,重写那些方法(空方法也是必需的,即使它们是空的):

yourSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {          
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (fromUser) {
                if (progress >= 0 && progress <= sizeSeekBar.getMax()) {                        

                    String progressString = String.valueOf(progress * 10);
                    yourTextView.setText(progressString); // the TextView Reference
                    seekBar.setSecondaryProgress(progress);
                }
            }

        }
    });

这个想法是只为搜索栏定义 20 个值,但总是将该值乘以 10 并显示该值。 如果你真的不需要 200 个值,那么使用 200 个值是没有意义的。

【讨论】:

  • +1 为简单起见。我搜索了其他问题,最终到了这里,但认为你应该得到 +1
  • 这似乎是更好的解决方案。我喜欢它如何直接跳到下一个数字。在数字不变的情况下取得进展似乎很奇怪。
【解决方案3】:

您可以通过 android:stepSize 属性使用 Material Components Library 提供的 Slider

    <com.google.android.material.slider.Slider
        android:valueFrom="0"
        android:valueTo="200"
        android:stepSize="10"
       ..>

【讨论】:

    【解决方案4】:

    您应该使用SeekBar.OnSeekBarChangeListener 来跟踪进度更改。致电mseek.setMax(200)。对当前值进行模运算来决定是否应该更新 textview。

    SeekBar.OnSeekBarChangeListener() {
    
        void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (progress % 10 == 0) {
                textview.setText(""+progress);
            }
        }
    }
    

    【讨论】:

    • 如果条形不是很宽和/或您的手指移动速度很快,这可能会跳过值。
    • 同意。这是我首先想到的。当然不是正确的答案。
    • 这是一个很好的例子,但@Kris Van Bael 是对的,它会跳过值。
    【解决方案5】:

    您也可以通过如下定义自定义 SeekBar 类来实现这一点

    public class CustomSeekBar extends AppCompatSeekBar {
    
    
    int SEEKBAR_MULTIPLIER = 1;
    
    public CustomSeekBar(Context context) {
        super(context);
    }
    
    public CustomSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public CustomSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    
    public void setSeekBarConfig( int SEEKBAR_MULTIPLIER, int SEEKBAR_MAX){
        setMax(SEEKBAR_MAX);
        this.SEEKBAR_MULTIPLIER = SEEKBAR_MULTIPLIER;
    }
    
    @Override
    public int getProgress() {
        return super.getProgress() * SEEKBAR_MULTIPLIER;
    }
    }
    

    并且可以通过以下方式使用

     CustomSeekBar mCustomSeekBar = (CustomSeekBar) findViewById(R.id.customSeekBar);
     mSeekBar.setSeekBarConfig(10,20);
    

    在 xml 中你应该添加 CustomSeekBar 而不是 SeekBar

    <*.CustomSeekBar
        com.quemb.qmbform.view:setSeekBarConfig="10"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/seekBar" />
    

    这样您就可以在整个 App 中重复使用自定义的 seekBar,而无需重复整个额外的计算。

    【讨论】:

      【解决方案6】:

      对于最小问题,您可以设置进度偏移量。这样,用户就不会低于你的最小值。

      int offset = 10;
      
      seekBar seekBar = (SeekBar)layout.findViewById(R.id.seekbar);
      seekBar.setProgress(0);
      seekBar.setMax(190); //with the offset, you need to adapt the max value
      TextView seekBarValue = (TextView)layout.findViewById(R.id.seekbarvalue);
      seekBarValue.setText(""+(seekBar.getProgress() + offset));
      
      seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
      
          @Override
          public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
              progress += offset;
      
              seekBarValue.setText(String.valueOf(progress));
          }
      
          @Override
          public void onStartTrackingTouch(SeekBar seekBar) {
      
          }
      
          @Override
          public void onStopTrackingTouch(SeekBar seekBar) {
      
          }
      });
      

      【讨论】:

        【解决方案7】:

        使用 Math.round 函数

        fun round(n: Int): Int {
            // Smaller multiple
            val a = n / 10 * 10
            // Larger multiple
            val b = a + 10
            // Return of closest of two
            return if (n - a > b - n) b else a
        }
        

        【讨论】:

          【解决方案8】:

          一种可能的解决方案是设置seekBar.setMax(20)(或XML 中的android:max="20"),并且每当您使用或显示该值时,将其乘以10。

          然后,SeekBar 似乎一次至少移动 20 个。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-04
            • 2015-05-02
            • 2022-12-19
            • 1970-01-01
            相关资源
            最近更新 更多