У меня есть ViewGroup верхнего уровня, который я называю SliderView, в котором я хочу обнаружить прокрутку. Это в основном работает, но один странный отказ сохраняется.
Суть SliderView заключается в том, чтобы переопределить onInterceptTouchEvent и, как только пользователь на самом деле будет прокручивать, верните "true", чтобы другие представления не могли отображать MotionEvent. Вот фрагмент кода:
public class SliderView extends ViewGroup
{
enum MoveState { MS_NONE, MS_HSCROLL, MS_VSCROLL };
private MoveState moveState = MoveState.MS_NONE;
... other code ...
public boolean onInterceptTouchEvent(MotionEvent e)
{
final int action = e.getAction();
switch (action & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
moveState = MoveState.MS_NONE;
break;
case MotionEvent.ACTION_MOVE:
if (moveState == MoveState.MS_NONE)
{
if (motion is horizontal)
{
moveState = MoveState.MS_VSCROLL;
return true;
}
else
moveState = MoveState.MS_VSCROLL; // let child window handl MotionEvent
}
else if (moveState == MoveState.MS_HSCROLL)
return true; // don't let children see motion event.
}
return super.onInterceptTouchEvent (e);
}
... other code ...
}
Насколько я понимаю, мой SliderView (который является самым внешним видом) всегда должен получать onInterceptTouchEvent. В одном из моих тестов, где дочерний уровень верхнего уровня есть, однако в следующем случае это не так.
Когда дочерний элемент верхнего уровня является ScrollView, onInterceptTouchEvent получает ACTION_MOVE, а мой код делает то, что я хочу. В другом случае, когда дочерний элемент верхнего уровня является LinearLayout, иногда он прерывается: он всегда получает ACTION_DOWN, но получает ACTION_MOVE только в том случае, если пользователь касается виджета внутри LinearLayout; при касании пустой области происходит только ACTION_DOWN.
Я буду замечать, что он ведет себя так, как будто проблемы с отказом происходят вне SliderView. Однако, если это так, зачем мне получать события ACTION_DOWN?
Второе примечание: глядя на исходный код ScrollView, я вижу, что он проверяет "inChild"; Я не понял, для чего это и как это может быть важно.