Android 中的自定义 SeekBar,仅在开始时触摸时允许前进

Custom SeekBar in Android, Only allow progression when touched at start

我试图停止搜索栏的进度,除非用户在 progress(10) 以下开始,这确保用户实际上必须滑动它,从而避免意外激活。到目前为止我已经尝试过了,看起来它可以工作,但是滑动条仍然可以从任何地方移动(进度(0)到进度(100)。

sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        private Boolean isInRange = true;

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

            if (seekBar.getProgress() > 95) {
                ((MainActivity)getActivity()).currentOrder = null;
                ((MainActivity)getActivity()).showMain();

            } else {
                seekBar.setProgress(0);
                isInRange = false;
            }

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            if (seekBar.getProgress() < 10) {
                isInRange = true;
            } else {
                seekBar.setProgress(0);
                isInRange = false;
            }
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if(!isInRange) {
                seekBar.setProgress(0);
            }
        }

    });// Set on seek bar change listener

为了以防万一你需要它,这里是 seekbars 容器的 XML 代码:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorFocus"
    android:layout_alignParentBottom="true"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/seperator_bottom"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/darker_gray"
        android:orientation="horizontal" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/btn_delivery_disabled"
        android:padding="16dp"
        android:layout_margin="16dp">

        <SeekBar
            android:id="@+id/seek"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:clickable="false"
            android:max="100"
            android:progressDrawable="@android:color/transparent"
            android:thumb="@mipmap/ic_slide" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/delivered"
            android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large"
            android:gravity="center"
            android:layout_centerVertical="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentStart="true"
            android:id="@+id/textView" />

    </RelativeLayout>

</LinearLayout>

setProgress是绝对值,与您当前的进度无关。当触摸不在 SeekBar 前 10% 内时,您实际上正在做的基本上是将进度重置为 0,而不是在进度的 10% 内是。当然,这是假设您无法提供 max 属性,在这种情况下,max 值设置为 100。

因此,您需要调整代码以读取当前值,然后将其与当前值进行比较,看看是否在 10% 以内。我还建议跟踪起始位置和结束位置,而不是只用一个简单的 boolean 值来跟踪它。然后你必须评估与当前位置相关的价值。