提高SeekBar的触控优先级

时间:2012-01-25 09:07:06

标签: android seekbar touch-event

我在SeekBar内有一个HorizontalScrollView,我发现很难抓住手柄并移动它。如果我没有完全触摸手柄,HorizontalScrollView将接收并消耗触摸事件。有没有办法增加SeekBar的优先级,以便触摸事件具有正常的“范围”,或者这只是一个坏主意/设计,我应该避免它?

2 个答案:

答案 0 :(得分:5)

这是解决此问题的另一种方法,而不扩展Frame布局 想法是在触摸SeekBar时禁用Horizo​​ntalScrollView的触摸事件 因此,例如,在初始化视图时,您可以定义如下内容:

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);
        }
    });