Повышение сенсорного приоритета SeekBar
У меня есть SeekBar
внутри HorizontalScrollView
и мне очень трудно схватиться за ручку и сдвинуть ее. Если я не коснусь точно на ручке, то HorizontalScrollView
будет получать и потреблять событие касания. Есть ли способ повысить приоритет SeekBar
так что у него будет нормальный "диапазон" для сенсорных событий или это просто плохая идея / дизайн, и мне следует избегать этого?
2 ответа
Я "решил" это следующим образом:
ПРИМЕЧАНИЕ. Мой макет прокрутки можно заблокировать, как описано здесь: /questions/38990582/otklyuchit-scrollview-programmno/38990602#38990602 (просто обратите внимание на мой ответ чуть ниже, я считаю, что это важно)
Затем я обернул свою панель поиска в 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);
}
});
Вот еще один способ исправить эту проблему без расширения макета фрейма.
Идея состоит в том, чтобы отключить сенсорное событие 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