Повышение сенсорного приоритета SeekBar - PullRequest
1 голос
/ 25 января 2012

У меня есть SeekBar внутри HorizontalScrollView, и мне очень трудно схватить ручку и переместить ее.Если я не коснусь точно ручки, HorizontalScrollView получит и использует событие касания.Есть ли способ повысить приоритет SeekBar, чтобы у него был обычный «диапазон» для сенсорных событий, или это просто плохая идея / дизайн, и мне следует его избегать?

Ответы [ 2 ]

5 голосов
/ 21 февраля 2013

Вот еще один способ исправить эту проблему без расширения макета фрейма.Идея состоит в том, чтобы отключить сенсорное событие HorizontalScrollView при касании SeekBar.Например, когда вы инициализируете представление, вы можете определить что-то вроде этого:

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)

0 голосов
/ 27 января 2012

Я «решил» это, выполнив следующее:

ПРИМЕЧАНИЕ: Мой макет прокрутки заблокирован, как объяснено здесь: 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);
        }
    });
...