在父视图中处理触摸但在子视图中处理Click事件

时间:2015-02-02 16:30:01

标签: android touch android-custom-view

我有一个自定义ViewGroup,它扩展了linearLayout,这个视图组有一个gridView作为子视图。我想如果mGridView点击mGridView.onClickListener调用并执行但在我的自定义视图组中处理其他触摸事件(如移动mGridView)(onTouchEvent()执行)。所以我在onInterceptTouchEvent:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

    int action = ev.getAction();
    int y = (int) ev.getY();

    if( action == MotionEvent.ACTION_DOWN && y > mGridView.getTop() )  //y > mGridView,getTop() checks if position of touch in mGridView Position or not.
       return false;

    return true;

}

但从未调用过mGridView.OnClickListener()。

1 个答案:

答案 0 :(得分:1)

click事件是一个复合事件,它不仅包含MotionEvent.ACTION_DOWN。

它应该有一个MotionEvent.ACTION_DOWN,可能还有其他几个MotionEvent.ACTION_MOVE,最后是一个MotionEvent.ACTION_UP,以及所有这些都在你点击的视图的范围内。

您应该在方法onInterceptTouchEvent(MotionEvent ev)中定义其他MotionEvent以“返回false”。 也许是这样的:

if( (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_DOWNaction == MotionEvent.ACTION_MOVE || action == MotionEvent.ACTION_UP) && y > mGridView.getTop() )

来自this的公寓,您可能已阅读过,请查看Detecting Common Gestures

或者(但不是真的建议)尝试不在View上使用OnClickListener而是使用OnTouchListener。使用当前代码,您应该在那里收到MotionEvent.ACTION_DOWN,您现在返回false