如何在两个重叠视图上捕获onTouch事件?

布局

! * Container是一个包含两个自定义视图的相对布局:OuterView1和InnerView2 * Outer View1是一个自定义视图,匹配父级的大小(全屏幕)* InnerView2也是一个自定义视图,放置在与OuterView1重叠的顶部。

  • Container是一个包含两个自定义视图的相对布局:OuterView1和InnerView2
  • Outer View1是一个自定义视图,匹配父级的大小(全屏)
  • 内部视图2也是一个自定义视图,放在与其重叠的OuterView1的顶部。

在OuterView1和InnerView2上,我想捕获这些触摸事件onSingleTapConfirmed()和onFling()。 OuterView1和InnerView2重叠的区域,我想控制传递给两个视图的触摸事件方法。

我试过这个:

容器类

@Override public boolean onInterceptTouchEvent(MotionEvent ev) { outerView1.onTouchEvent(ev); innerView2.onTouchEvent(ev); return false; } 

OuterView1类

  @Override public boolean onTouchEvent(MotionEvent event) { gesture.onTouchEvent(event); return true; } 

gesture是一个GestureDetector.SimpleOnGestureListener的实例,包含onDown(),onFling()和onSingleTapConfirmed()方法的日志语句

InnerView2类

  @Override public boolean onTouchEvent(MotionEvent event) { gesture.onTouchEvent(event); return true; } 

gesture是一个GestureDetector.SimpleOnGestureListener的实例,包含onDown(),onFling()和onSingleTapConfirmed()方法的日志语句

采用这种方法,我一直在两个视图的onDown()方法中获得callback。 但是在onSingleTapConfirmed()和onFling()方法中我看不到一致的行为

当我点击三次红圈(在屏幕截图中),我有三种不同的行为

  • 首先尝试(希望的行为)

     10-14 09:03:14.155: I/OuterView1(27776): OuterView1.onDown() 10-14 09:03:14.155: I/InnerView2(27776): InnerView2.onDown() 10-14 09:03:14.155: W/GestureDetector(27776): [pen gesture] isConsideredDoubleTap - timeout 10-14 09:03:14.155: I/InnerView2(27776): InnerView2.onDown() 10-14 09:03:14.460: I/OuterView1(27776): OuterView1.onSingleTapConfirmed() 10-14 09:03:14.460: I/InnerView2(27776): InnerView2.onSingleTapConfirmed() 
  • 第二次尝试(只有一个视图获取onSingleTapConfirmed())

     10-14 09:04:11.615: I/OuterView1(27776): OuterView1.onDown() 10-14 09:04:11.615: I/InnerView2(27776): InnerView2.onDown() 10-14 09:04:11.615: W/GestureDetector(27776): [pen gesture] isConsideredDoubleTap - timeout 10-14 09:04:11.615: I/InnerView2(27776): InnerView2.onDown() 10-14 09:04:11.915: I/OuterView1(27776): OuterView1.onSingleTapConfirmed() 
  • 第三次尝试(一个视图获取onFling(),另一个获取onSingleTapConfirmed())

     10-14 09:04:04.180: I/OuterView1(27776): OuterView1.onDown() 10-14 09:04:04.180: I/InnerView2(27776): InnerView2.onDown() 10-14 09:04:04.180: W/GestureDetector(27776): [pen gesture] isConsideredDoubleTap - timeout 10-14 09:04:04.180: I/InnerView2(27776): InnerView2.onDown() 10-14 09:04:04.255: I/InnerView2(27776): InnerView2.onFling() 10-14 09:04:04.480: I/OuterView1(27776): OuterView1.onSingleTapConfirmed() 

你能帮我在OuterView1和InnerView2上捕捉触摸事件吗?

Solutions Collecting From Web of "如何在两个重叠视图上捕获onTouch事件?"

因此,在重叠视图的情况下,触摸事件从最上面的孩子到后面的孩子,然后是另一个孩子,等等。 然而,如果最顶层的孩子消费触摸事件(即在接收事件时处理它),那么该视图下方的视图将不会接收到触摸事件。

如果onTouchEvent返回“true”,那么它告诉视图pipe理器它已经处理了触摸并且不希望事件被分派到其他视图。 如果您希望视图下方的视图也接受触摸,那么您想从onTouchEvent中为第一个视图返回“false”,在您的情况下是Innerview。

另外,在你的代码中,我注意到你正在以编程方式将触摸事件分配给来自容器类的2个视图。 即使只有OuterView被点击时,这也会导致InnerView得到触摸。 如果你想要的function,那就没关系。 如果你想让InnerView在事件被触及的时候才能得到,那么你不希望容器类在这两个视图上明确地调用onTouchEvent。 视图层次将为你做。

关于在BOTH视图上接收onFling或onSingleTapConfirmed – (假设你想让触摸事件通过后面的视图,你从InnerView的onTouchEvent返回'false'),InnerView已经将事件传递到了后面的视图它,所以它没有得到手势的结尾,意识到只是发生了一阵子,类似onSingleTapConfirmed。 如果你仍然想要这些,那么你可能不得不以编程方式在OuterView检测到的手势末尾调度触摸事件。 意思是说,如果OuterView得到了一个扔手势,那么它也是一个为InnerView的投掷,所以编程方式也使InnerView的手势发生。 这是相当复杂的,调度在层次结构中倒退并不是一件平常的事情。

希望我没有把你搞糊涂。 随意问,如果我不清楚,我会再试一次。

这将有助于: 处理ViewGroup中的TouchEvents