如何在内部 SeekBar 上禁用 ScrollView 的工作?
How to disable work of ScrollView on inner SeekBar?
例如,当我移动circleseekbar滑块时,scrollview也起作用,从而将整个布局向上移动,我只需要能够改变滑块的位置。
尝试了 android:scrollbars = "none"
- 一切都失败了。
您需要暂时停止 ScrollView
滚动,并在完成对 SeekBar
的操作后重新启用它。
要实现这一点: 不要使用 ScrollView
,而是使用下面自定义的一个,其中覆盖 onInterceptTouchEvent
就可以了。
public class LockableScrollView extends ScrollView {
// true if we can scroll (not locked)
// false if we cannot scroll (locked)
private boolean mScrollable = true;
public LockableScrollView(Context context) {
super(context);
}
public LockableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setScrollingEnabled(boolean enabled) {
mScrollable = enabled;
}
public boolean isScrollable() {
return mScrollable;
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {// if we can scroll pass the event to the superclass
return mScrollable && super.onTouchEvent(ev);
}
return super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Don't do anything with intercepted touch events if
// we are not scrollable
return mScrollable && super.onInterceptTouchEvent(ev);
}
}
您可以通过调用 myScrollView.setScrollingEnabled(false)
在触摸 SeekBar
时暂时停止滚动;当您将手指从 Seekbar
上移开时启用它,如下所示
seekBar.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
myScrollView.setScrollingEnabled(false);
else if (event.getAction() == MotionEvent.ACTION_UP)
myScrollView.setScrollingEnabled(true);
return false;
}
});
Reference of LocableScrollView
例如,当我移动circleseekbar滑块时,scrollview也起作用,从而将整个布局向上移动,我只需要能够改变滑块的位置。
尝试了 android:scrollbars = "none"
- 一切都失败了。
您需要暂时停止 ScrollView
滚动,并在完成对 SeekBar
的操作后重新启用它。
要实现这一点: 不要使用 ScrollView
,而是使用下面自定义的一个,其中覆盖 onInterceptTouchEvent
就可以了。
public class LockableScrollView extends ScrollView {
// true if we can scroll (not locked)
// false if we cannot scroll (locked)
private boolean mScrollable = true;
public LockableScrollView(Context context) {
super(context);
}
public LockableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setScrollingEnabled(boolean enabled) {
mScrollable = enabled;
}
public boolean isScrollable() {
return mScrollable;
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {// if we can scroll pass the event to the superclass
return mScrollable && super.onTouchEvent(ev);
}
return super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Don't do anything with intercepted touch events if
// we are not scrollable
return mScrollable && super.onInterceptTouchEvent(ev);
}
}
您可以通过调用 myScrollView.setScrollingEnabled(false)
在触摸 SeekBar
时暂时停止滚动;当您将手指从 Seekbar
上移开时启用它,如下所示
seekBar.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
myScrollView.setScrollingEnabled(false);
else if (event.getAction() == MotionEvent.ACTION_UP)
myScrollView.setScrollingEnabled(true);
return false;
}
});
Reference of LocableScrollView