我在SeekBar
内有一个HorizontalScrollView
,我发现很难抓住手柄并移动它。如果我没有完全触摸手柄,HorizontalScrollView
将接收并消耗触摸事件。有没有办法增加SeekBar
的优先级,以便触摸事件具有正常的“范围”,或者这只是一个坏主意/设计,我应该避免它?
答案 0 :(得分:5)
这是解决此问题的另一种方法,而不扩展Frame布局 想法是在触摸SeekBar时禁用HorizontalScrollView的触摸事件 因此,例如,在初始化视图时,您可以定义如下内容:
protected void onCreate(final Bundle savedInstanceState)
{
[...]
final HorizontalScrollView scrollView = (HorizontalScrollView) findViewById(R.id.vo_cw_hsv);
final SeekBar opacitySeekBar = (SeekBar) findViewById(R.id.vo_cw_seekbar);
opacitySeekBar.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(final View view, final MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE)
scrollView.requestDisallowInterceptTouchEvent(true);
return false;
}
});
[...]
}
有关更多信息,您可以阅读ViewParent类的文档: http://developer.android.com/reference/android/view/ViewParent.html#requestDisallowInterceptTouchEvent(boolean)
答案 1 :(得分:0)
我通过以下方式“解决”了它:
注意:我的滚动布局是可锁定的,如下所述:https://stackoverflow.com/a/5763815/1067721(只需稍微注意我的回答,我发现这一点很重要)
然后我将我的搜索栏包装在FrameLayout中,能够拦截触摸事件:
public class InterceptFrameLayout extends FrameLayout {
private OnTouchListener mListener;
public InterceptFrameLayout(Context context) {
super(context);
}
public InterceptFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent (MotionEvent ev) {
return onTouchEvent(ev);
}
@Override
public void setOnTouchListener (View.OnTouchListener l) {
mListener = l;
}
@Override
public boolean onTouchEvent (MotionEvent ev) {
if (mListener != null) {
return mListener.onTouch(this, ev);
} else {
return super.onTouchEvent(ev);
}
}
}
然后,在我的Fragment
上,我实现了侦听器并让SeekBar使用该事件:
volWrapper.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
mHostingScroll.setScrollable(false);
break;
}
case MotionEvent.ACTION_UP: {
mHostingScroll.setScrollable(true);
break;
}
}
return volumeBar.onTouchEvent(event);
}
});