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
值来跟踪它。然后你必须评估与当前位置相关的价值。
我试图停止搜索栏的进度,除非用户在 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
值来跟踪它。然后你必须评估与当前位置相关的价值。