【问题标题】:Increasing touch priority of a SeekBar增加 SeekBar 的触摸优先级
【发布时间】:2012-01-25 09:07:06
【问题描述】:

我在HorizontalScrollView 中有一个SeekBar,我发现很难抓住手柄并移动它。如果我没有准确地触摸手柄,HorizontalScrollView 将接收并使用触摸事件。有没有办法提高SeekBar 的优先级,使其具有正常的触摸事件“范围”,或者这只是一个坏主意/设计,我应该避免它?

【问题讨论】:

    标签: android seekbar touch-event


    【解决方案1】:

    这是解决此问题的另一种方法,无需扩展框架布局。
    这个想法是在您触摸 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)

    【讨论】:

    • 这正是我想要的
    【解决方案2】:

    我通过以下方式“解决”了它:

    注意:我的滚动布局是可锁定的,如下所述: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);
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-21
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多